Binary Tree Maximum Path Sum 求二叉树的最大路径和
题目要求:Given a binary tree, find the maximum path sum.
The path may start and end at any node in the tree.
For example:
Given the below binary tree,
1
/ \
2 3
Return 6.
思路:我们先来看一个例子,这个树的最远路径和为7+11+4+13
4
/ \
11 13
/ \
7 2
树的递归解法一般都是递归到叶节点,然后开始边处理边回溯到根节点。
那么我们就假设此时已经递归到结点7了,那么其没有左右子节点,所以如果以结点7为根结点的子树最大路径和就是7。
然后回溯到结点11,如果以结点11为根结点的子树,我们知道最大路径和为7+11+2=20。
但是当回溯到结点4的时候,对于结点11来说,就不能同时取两条路径了,只能取左路径,或者是右路径,所以当根结点是4的时候,那么结点11只能取其左子结点7,因为7大于2。
所以,对于每个结点来说,我们要知道经过其左子结点的path之和大还是经过右子节点的path之和大。那么我们的递归函数返回值就可以定义为以当前结点为根结点,到叶节点的最大路径之和,然后全局路径最大值放在参数中,用结果res来表示。
在递归函数中,如果当前结点不存在,那么直接返回0。
否则就分别对其左右子节点调用递归函数,由于路径和有可能为负数,而我们当然不希望加上负的路径和,所以我们和0相比,取较大的那个,就是要么不加,加就要加正数。
然后我们来更新全局最大值结果res,就是以左子结点为终点的最大path之和加上以右子结点为终点的最大path之和,还要加上当前结点值,这样就组成了一个条完整的路径。
而我们返回值是取left和right中的较大值加上当前结点值,因为我们返回值的定义是以当前结点为终点的path之和,所以只能取left和right中较大的那个值,而不是两个都要。红色字体部分是转载此链接的,如有问题请留言,谢谢!!!
链接地址:https://www.cnblogs.com/grandyang/p/4280120.html
这是我的思路:
0:我们先从根节点开始,开始左子树,右子树的遍历;
1:我们先遍历左子树,然后每次求取它的路径最大值;
2:我们接着遍历右子树,然后每次求取它的路径最大值;
3:每次我们都会 更新sum,求得每次的最大值;
4:递归函数中,我们每次求得左和右中较大的那个作为返回值,然后进行每次的递归;
关于 sum=INT_MIN;//考虑到负数的情况,从最小的整数开始比较
这个是关于int sum=INT_MIN的详情,及使用:
https://mp.youkuaiyun.com/postedit/81869132
下面是我在牛客网oj环境下编译通过的:
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
int sum;
public:
int maxPathSum(TreeNode *root) {
sum=INT_MIN;//考虑到负数的情况,从最小的整数开始比较
help(root);//从根节点开始递归
return sum;//返回路径的最大值
}
int help(TreeNode* root){
if(!root) return 0;//递归到叶节点的子节点,返回0
int left = max(0, help(root->left));//对根节点的左叶节点开始递归
int right = max(0, help(root->right));//对根节点的右叶节点开始递归
sum = max(sum, left+right+root->val);//更新现有路径最大值
return max(left, right)+root->val;
}
};