設乙個n個節點的二叉樹tree的中序遍歷為(1,2,3,…,n),其中數字1,2,3,…,n為節點編號。
每個節點都有乙個分數(均為正整數),記第i個節點的分數為di,tree及它的每個子樹都有乙個加分,任一棵子樹subtree(也包含tree本身)的加分計算方法如下:
subtree的左子樹的加分 × subtree的右子樹的加分 + subtree的根的分數
若某個子樹為空,規定其加分為1。葉子的加分就是葉節點本身的分數,不考慮它的空子樹。
試求一棵符合中序遍歷為(1,2,3,…,n)且加分最高的二叉樹tree。
要求輸出:
(1)tree的最高加分
(2)tree的前序遍歷
f[i][j]來表示節點i到節點j成樹的最大加分
f[i][i]=a[i]其中a[i]為第i個節點的分數。
分數 = 左子樹 * 右子樹 +根
那我們只需要知道左右子樹的分數和根的分數就可以了,至於樹長什麼樣並不關心
我們列舉根節點k
f[i][j] = f[i][k-1] * f[k+1][j] + f[k][k];
為了後面前序遍歷的實現,我們用root[i][j]來表示節點i到節點j成樹的最大加法所選的根節點
前序遍歷:中前後
#include
#include
using
namespace std;
int n,v[39]
,f[47][
47],i,j,k,root[49]
[49];
void
print
(int l,
int r)
printf
("%d "
,root[l]
[r])
;print
(l,root[l]
[r]-1)
;print
(root[l]
[r]+
1,r);}
intmain()
for(i=n; i>=
1; i--
)for
(j=i+
1; j<=n; j++
)for
(k=i; k<=j; k++)}
printf
("%d\n"
,f[1
][n]);
print(1
,n);
return0;
}
加分二叉樹
描述 設乙個n個節點的二叉樹tree的中序遍歷為 l,2,3,n 其中數字1,2,3,n為節點編號。每個節點都有乙個分數 均為正整數 記第i個節點的分數為di,tree及它的每個子樹都有乙個加分,任一棵子樹subtree 也包含tree本身 的加分計算方法如下 subtree的左子樹的加分 subt...
加分二叉樹
設乙個n個節點的二叉樹tree的中序遍歷為 l,2,3,n 其中數字1,2,3,n為節點編號。每個節點都有乙個分數 均為正整數 記第i個節點的分數為di,tree及它的每個子樹都有乙個加分,任一棵子樹subtree 也包含tree本身 的加分計算方法如下 subtree的左子樹的加分 subtree...
加分二叉樹
設乙個n個節點的二叉樹tree的中序遍歷為 1,2,3,n 其中數字1,2,3,n為節點編號。每個節點都有乙個分數 均為正整數 記第i個節點的分數為di,tree及它的每個子樹都有乙個加分,任一棵子樹subtree 也包含tree本身 的加分計算方法如下 subtree的左子樹的加分 subtree...