此题要求出二叉树中路径和最大的数值,思路如下:
对于一棵子树,其路径有三种情况
1,当前父节点
2,左结点-->当前父节点--> 祖父结点
3,右结点-->当前父节点-->祖父节点
该三种情况取最大值作为中间值返回给调用函数,
需要特别注意的是:对于“左结点-->当前父节点-->右结点”,该路径值与上述三种情况的最大值作比较保存较大的作为中间值,
且注意此种情况不能折回到当前父节点再往上走,因为题目不允许折返情况!
代码 C++
class Solution {
public:
int maxPathSum(TreeNode *root) {
int maxSum = (numeric_limits<int>::min)();
maxPathSumHelper(root, maxSum);
// 程序最终结果是maxSum
return maxSum;
}
//maxSum为引用传递
int maxPathSumHelper(TreeNode *root, int &maxSum)
{
if(root==NULL)
return 0;
int leftMax = maxPathSumHelper(root->left, maxSum);
int rightMax = maxPathSumHelper(root->right, maxSum);
int throughtRoot = root->val + leftMax + rightMax;
int maxThroughRootToParent = max(root->val, max(leftMax, rightMax)+root->val);
maxSum = max(maxSum, max(throughtRoot, maxThroughRootToParent));
//注意返回值是maxThroughRootToParent
return maxThroughRootToParent;
}
};