问题描述
给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
解题报告
以某一子树的根节点为研究对象,如果最大路径经过该子树,则必定 经过该子树的根节点以及该子树 左右子树 中的某一子树。
实现时:
- 设置全局变量
val
,它记录了整棵树的最大路径和。 - 递归搜索每棵子树的根节点,其返回经过该子树根节点的的最大路径和【该路径只经过该子树的某一子树】。
- 在递归的过程中,更新
val
的值【在本身的值以及经过递归子树的根节点(是否包含递归子树
左右子树的最大路径和
取决于经过左右子树的最大路径和
是否大于0
)这两者中取最大值】 - 具体参考代码
实现代码
class Solution {
public:
int maxPathSum(TreeNode* root, int &val)
{
if (root == nullptr) return 0;
int left = maxPathSum(root->left, val);
int right = maxPathSum(root->right, val);
int lmr = root->val + max(0, left) + max(0, right);
int ret = root->val + max(0, max(left, right));
val = max(val, lmr);
cout<<root->val<<" "<<left<<" "<<right<<" "<<lmr<<" "<<ret<<" "<<val<<endl;
return ret;
}
int maxPathSum(TreeNode* root)
{
int val = INT_MIN;
maxPathSum(root, val);
return val;
}
// 作者:ikaruga
// 链接:https://leetcode-cn.com/problems/binary-tree-maximum-path-sum/solution/er-cha-shu-zhong-de-zui-da-lu-jing-he-by-ikaruga/
// 来源:力扣(LeetCode)
// 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
};
参考资料
[1] Leetcode 124. 二叉树的最大路径和
[2] 题解区:ikaruga