• 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. }  
  • 相关阅读:
    90. 子集 II
    274. H 指数
    1291. 顺次数
    StreamWriter 跟BinaryWriter的区别
    非常有用的正则表达式
    linux菜单恢复
    VS2008的诡异问题
    一些常用算法 练手的的代码
    string 类型为空的处理方法
    left jion 的多表连接用法。
  • 原文地址:https://www.cnblogs.com/hdk1993/p/5851284.html
Copyright © 2020-2023  润新知