
二叉树的最大路径和(LeetCode-124)
发布日期:2021-05-07 13:31:04
浏览次数:16
分类:原创文章
本文共 2867 字,大约阅读时间需要 9 分钟。
1、题目描述
输入一棵二叉树,求这课二叉树所有路径中最大的路径和。比如输入二叉树为:[-10,9,20,null,null,15,7],输出:42。
2、解题思路
我们知道,给定一个数组,求这个数组的连续子数组的最大和是比较容易的。而这道题目是将二叉树与连续子数组的最大和糅合在一起。因此我们需要在递归中求出二叉树路径的连续子数组的最大和。因此,在二叉树的递归函数中,输入一个节点,我们需要求出以这个节点为根的二叉树的连续子数组的最大和。递归函数进行如下判断:
- 如果节点的左子树和右子树为空,那么连续子数组的最大和为这个节点值。
- 如果左子树不为空,那么遍历左子树,求出以左子树为根的树中连续子数组的最大和。
- 如果右子树不为空,那么遍历右子树,求出以右子树为根的树中连续子数组的最大和。
- 接着对从左子树最大和、右子树最大和、节点值、左子树最大和 + 节点值、右子树最大和 + 节点值、左子树+右子树+节点值中取出最大的保存即可。
int maxPathSum(TreeNode* root) { if(root==nullptr) return 0; int sum = 0; int max_len = root->val; max_path(root,max_len,sum); return max_len; } void max_path(TreeNode *p,int &max_len,int &sum){ int left = 0; //左子树的路径最大路径和 int right = 0; //右子树路径的最大路径和 int left_sum=0; //左子树加上根节点的最大路径和 int right_sum=0; //右子树加上根节点的最大路径和 if(p->left==nullptr&&p->right==nullptr){ //左右子树都为空,路劲和为节点值 sum = p->val; max_len = max_len > p->val ? max_len : p->val; return; } if(p->left&&p->right){ //左右子树都不为空,则分开求 max_path(p->left,max_len,left); max_path(p->right,max_len,right); if(left < 0) left_sum = p->val; else left_sum = left + p->val; if(right < 0) right_sum = p->val; else right_sum = right + p->val; sum = left_sum > right_sum?left_sum:right_sum; max_len = Max2(max_len,left,right,left + right + p->val,p->val,sum); return; } if(p->left==nullptr&&p->right){ //左子树为空,右子树不为空 max_path(p->right,max_len,right); if(right < 0) right_sum = p->val; else right_sum = right + p->val; sum = right_sum; max_len = Max(right,max_len,p->val,right + p->val,right_sum); return; } if(p->right==nullptr&&p->left){ //右子树为空,左子树不为空 max_path(p->left,max_len,left); if(left < 0) left_sum = p->val; else left_sum = left + p->val; sum = left_sum; max_len = Max(left, max_len ,p->val,left + p->val,sum); return; } } int Max(int a,int b,int c,int d,int e){ //求5个数的最大值 int temp = a; if(temp<b) temp = b; if(temp<c) temp = c; if(temp<d) temp = d; if(temp<e) temp = e; return temp; } int Max2(int a,int b,int c,int d,int e,int f){ //求6个数的最大值 int temp = a; if(temp<b) temp = b; if(temp<c) temp = c; if(temp<d) temp = d; if(temp<e) temp = e; if(temp<f) temp = f; return temp; }
发表评论
最新留言
不错!
[***.144.177.141]2025年03月30日 02时54分39秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
上周热点回顾(7.27-8.2)
2021-05-09
上周热点回顾(9.28-10.4)
2021-05-09
[网站公告]数据库服务器IOPS跑满造成网站不能正常访问
2021-05-09
上周热点回顾(3.28-4.3)
2021-05-09
上周热点回顾(5.2-5.8)
2021-05-09
上周热点回顾(5.9-5.15)
2021-05-09
上周热点回顾(8.8-8.14)
2021-05-09
.NET跨平台之旅:将示例站点升级至 .NET Core 1.1 Preview 1
2021-05-09
上周热点回顾(10.24-10.30)
2021-05-09
上周热点回顾(12.12-12.18)
2021-05-09
上周热点回顾(1.16-1.22)
2021-05-09
上周热点回顾(1.23-1.29)
2021-05-09
上周热点回顾(2.27-3.5)
2021-05-09
上周热点回顾(3.20-3.26)
2021-05-09
上周热点回顾(4.24-4.30)
2021-05-09
[故障公告]博客站点1台负载均衡遭遇流量攻击,造成联通与移动用户无法正常访问
2021-05-09
上周热点回顾(5.1-5.7)
2021-05-09
上周热点回顾(5.8-5.14)
2021-05-09
上周热点回顾(5.29-6.4)
2021-05-09