2016搜狐筆試二叉樹和最大的子樹


問題描述:

 

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

 

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

 

代碼:

[cpp]  view plain copy
 
    1. #include <iostream>  
    2. #include <limits>  
    3. using namespace std;  
    4.   
    5. struct Node  
    6. {  
    7.     long data;  
    8.     Node *left;  
    9.     Node *right;  
    10. };  
    11.   
    12.   
    13. //  由於要更新最大值和最大子樹根,因此采用了引用參數  
    14. //  也可以考慮使用全局變量來處理  
    15. long Max_sub_tree(Node *root , long &max_sum , Node *& sub_root)  
    16. {  
    17.     if(NULL == root)  
    18.     {  
    19.         sub_root = root;  
    20.         return 0;  
    21.     }  
    22.       
    23.       
    24.     //  采用后續遍歷  
    25.     long left_sum = Max_sub_tree(root->left , max_sum , sub_root);       //左子樹的總和(計算總和過程中可能已經更新了當前的最大值和子樹)  
    26.     long right_sum = Max_sub_tree(root->right , max_sum , sub_root); //再計算右子樹  
    27.       
    28.     long sum = root->data + left_sum + right_sum;  
    29.     if(sum >= max_sum)  
    30.     {  
    31.         max_sum = sum;  
    32.         sub_root = root;  
    33.     }  
    34.       
    35.     return sum;  
    36. }  
    37.   
    38. int main()  
    39. {  
    40.     Node p = {1,NULL,NULL};  
    41.     Node q = {-3,NULL,NULL};  
    42.     Node lr = {2 , &p , &q};  
    43.     Node rr = {1 , &q , &p};  
    44.     Node r = {5 , &lr , &rr};  
    45.     Node *re = NULL;  
    46.     long max_sum = numeric_limits<long>::min();  
    47.     long sum = Max_sub_tree(&r , max_sum , re);  
    48.     if(NULL == re)  
    49.     {  
    50.         cout<<"empty tree!!!";  
    51.     }  
    52.     else  
    53.     {  
    54.         cout<<"max sum is :"<<max_sum<<endl;  
    55.     }  
    56.     return 0;  
    57. }  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM