2016搜狐笔试二叉树和最大的子树

问题描述:

 

给一个二叉树,每个节点都是正或负整数,如何找到一个子树,它所有节点的和最大?

 

思路:采用自底向上的计算。先计算左右子树总和值,用左右子树的总和加上当前节点值,如果当前总和大于最大值,则更新最大值,同时将最大子树根节点更新为当前根。简单说,就是后序遍历。

 

代码:

[cpp] view plaincopy
 
    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. }  
posted @ 2016-09-07 22:05  程序员修练之路  阅读(1845)  评论(3编辑  收藏  举报