博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2016搜狐笔试二叉树和最大的子树
阅读量:6533 次
发布时间:2019-06-24

本文共 1054 字,大约阅读时间需要 3 分钟。

问题描述:

 

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

 

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

 

代码:

[cpp] 
 
    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. }  

转载地址:http://plqbo.baihongyu.com/

你可能感兴趣的文章
python 获取进程pid号
查看>>
链表中插入一个节点的三种情况
查看>>
洛谷.4180.[模板]次小生成树Tree(Kruskal LCA 倍增)
查看>>
TCL函数“参数自动补全” 与 “help 信息显示”
查看>>
POJ1050To the Max
查看>>
汇编基础--标识符、标号、伪指令和指令
查看>>
Linux软中断、tasklet和工作队列
查看>>
如何解决ORA-28002 the password will expire within 7 days问题(密码快过期)
查看>>
Asp.Net Core 轻松学-利用日志监视进行服务遥测
查看>>
LightSwitch社区资源搜集
查看>>
Android通讯录查询篇--ContactsContract.Data 二(续)
查看>>
IT人的自我导向型学习:开篇杂谈
查看>>
[原创]BizTalk动手实验系列目录
查看>>
HDU 4611Balls Rearrangement(思维)
查看>>
[LeetCode] Majority Element II
查看>>
minGW, cygwin, GnuWin32【C++的跨平台交叉编译问题】
查看>>
我的Dll(动态链接库)学习笔记(转)
查看>>
应用程序域
查看>>
有向图的拓扑排序算法JAVA实现
查看>>
HTML页面跳转的5种方法
查看>>