問題描述:
給乙個二叉樹,每個節點都是正或負整數,如何找到乙個子樹,它所有節點的和最大?
思路:採用自底向上的計算。先計算左右子樹總和值,用左右子樹的總和加上當前節點值,如果當前總和大於最大值,則更新最大值,同時將最大子樹根節點更新為當前根。簡單說,就是後序遍歷。
**:
#include #include using namespace std;
struct node
;// 由於要更新最大值和最大子樹根,因此採用了引用引數
// 也可以考慮使用全域性變數來處理
long max_sub_tree(node *root , long &max_sum , node *& sub_root)
// 採用後續遍歷
long left_sum = max_sub_tree(root->left , max_sum , sub_root); //左子樹的總和(計算總和過程中可能已經更新了當前的最大值和子樹)
long right_sum = max_sub_tree(root->right , max_sum , sub_root); //再計算右子樹
long sum = root->data + left_sum + right_sum;
if(sum >= max_sum)
return sum;
}int main()
; node q = ;
node lr = ;
node rr = ;
node r = ;
node *re = null;
long max_sum = numeric_limits::min();
long sum = max_sub_tree(&r , max_sum , re);
if(null == re)
else
system("pause");
return 0;
}
最大子樹和
題目描述 小明對數學飽有興趣,並且是個勤奮好學的學生,總是在課後留在教室向老師請教一些問題。一天他早晨騎車去上課,路上見到乙個老伯正在修剪花花草草,頓時想到了乙個有關修剪花卉的問題。於是當日課後,小明就向老師提出了這個問題 一株奇怪的花卉,上面共連有n 朵花,共有n 1條枝幹將花兒連在一起,並且未修...
緊急疏散(最大子樹)
體育場突然著火了,現場需要緊急疏散,但是過道真的是太窄了,同時只能容許乙個人通過。現在知道了體育場的所有座位分布,座位分布圖是一棵樹,已知每個座位上都坐了乙個人,安全出口在樹的根部,也就是1號結點的位置上。其他節點上的人每秒都能向樹根部前進乙個結點,但是除了安全出口以外,沒有任何乙個結點可以同時容納...
屠龍者(最大子樹)
小明是a村里的屠龍者,他一直保衛著村子的和平,以不受惡龍的侵擾。而惡龍們也對小明恨之入骨,於是惡龍們決定組織一次集體進攻,以打敗小明,拿下a村。小明知道,惡龍集體進攻的時候,會在彼此之間建立一種神秘的鏈結,而被這種鏈結連線起來的惡龍能夠增長彼此的能力,且每有乙隻惡龍加入到乙個鏈結中,這個鏈結裡的所有...