尋找最大子樹

2021-06-09 15:25:40 字數 983 閱讀 7208

問題描述:

給乙個二叉樹,每個節點都是正或負整數,如何找到乙個子樹,它所有節點的和最大? 

思路:採用自底向上的計算。先計算左右子樹總和值,用左右子樹的總和加上當前節點值,如果當前總和大於最大值,則更新最大值,同時將最大子樹根節點更新為當前根。簡單說,就是後序遍歷。

**:

#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村。小明知道,惡龍集體進攻的時候,會在彼此之間建立一種神秘的鏈結,而被這種鏈結連線起來的惡龍能夠增長彼此的能力,且每有乙隻惡龍加入到乙個鏈結中,這個鏈結裡的所有...