問題描述:
給一個二叉樹,每個節點都是正或負整數,如何找到一個子樹,它所有節點的和最大?
思路:采用自底向上的計算。先計算左右子樹總和值,用左右子樹的總和加上當前節點值,如果當前總和大於最大值,則更新最大值,同時將最大子樹根節點更新為當前根。簡單說,就是后序遍歷。
代碼:
- #include <iostream>
- #include <limits>
- using namespace std;
- struct Node
- {
- long data;
- Node *left;
- Node *right;
- };
- // 由於要更新最大值和最大子樹根,因此采用了引用參數
- // 也可以考慮使用全局變量來處理
- long Max_sub_tree(Node *root , long &max_sum , Node *& sub_root)
- {
- if(NULL == root)
- {
- sub_root = root;
- return 0;
- }
- // 采用后續遍歷
- 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)
- {
- max_sum = sum;
- sub_root = root;
- }
- return sum;
- }
- int main()
- {
- Node p = {1,NULL,NULL};
- Node q = {-3,NULL,NULL};
- Node lr = {2 , &p , &q};
- Node rr = {1 , &q , &p};
- Node r = {5 , &lr , &rr};
- Node *re = NULL;
- long max_sum = numeric_limits<long>::min();
- long sum = Max_sub_tree(&r , max_sum , re);
- if(NULL == re)
- {
- cout<<"empty tree!!!";
- }
- else
- {
- cout<<"max sum is :"<<max_sum<<endl;
- }
- return 0;
- }