题目描述:
路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。
路径和 是路径中各节点值的总和。
给你一个二叉树的根节点 root ,返回其 最大路径和 。
示例 1:
输入:root = [1,2,3]
输出:6
解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6
示例 2:
输入:root = [-10,9,20,null,null,15,7]
输出:42
解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42
提示:
树中节点数目范围是 [1, 3 * 104]
-1000 <= Node.val <= 1000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-maximum-path-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解析:
整体采用后序遍历:
最大值和最大返回值同步进行。寻找左节点最大值
寻找右结点最大值
当此时的根节点为孩子结点时,只能返回其根和其中一侧结点。 逐步向上
代码:
class Solution {
public:
int getMax(TreeNode * root,int &maxsum){
//注意此时返回值
if(!root)
return -100000;
int left=getMax(root->left,maxsum);
int right=getMax(root->right,maxsum);
int submaxsum=max(right,left);
//后边要用,先存储下来
int bigger=submaxsum;
//中间加上左右最大值,与左右最大值比较
submaxsum=root->val>0?submaxsum+root->val:submaxsum;
//根+左或右的最大值,与三项最大值比较
submaxsum=max(submaxsum,left+right+root->val);
maxsum=max(submaxsum,maxsum);
//返回值必须是:根节点,或者是根节点加上左或者右结点(取最大)
return bigger+root->val>root->val?bigger+root->val:root->val;
}
int maxPathSum(TreeNode* root) {
int maxsum=root->val;
getMax(root,maxsum);
return maxsum;
}
};
作者:allforyou
链接:https://leetcode-cn.com/problems/binary-tree-maximum-path-sum/solution/chou-xu-bian-li-by-allforyou-gt5w/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。