124. Binary Tree Maximum Path Sum

Given a non-empty binary tree, find the maximum path sum.

For this problem, a path is defined as any sequence of nodes from some starting node to any node in the tree along the parent-child connections. The path must contain at least one node and does not need to go through the root.

Example 1:

Input: [1,2,3]

       1
      / \
     2   3

Output: 6

Example 2:

Input: [-10,9,20,null,null,15,7]

   -10
   / \
  9  20
    /  \
   15   7

Output: 42

这是我在leetcode上不看解析做对的第一道Hard难度的题目,很有一点纪念意义。

这道题目最初我没有理解题意:a path is defined as any sequence of nodes from some starting node to any node in the tree along the parent-child connections。Example1和2里给出的两个树有一定的迷惑性。

提交后有一个测试例子如下图所示(背后的代码无视:)):


Expected输出为48,我一看就晕了,这不明显的是全部节点吗?明显输出应该是55啊。。。


后来问了问原来别人是这样理解的:


好吧,Path这里是不能分叉的(不然也不叫Path了),没想清楚就开始写了。但这里无论怎么理解题意,都不影响思路:

明显我们需要分治思想,运用递归求出每个子节点为根节点的树的CurMaxPathSum和CurSum,CurMaxPathSum用来表示只在以当前节点

为根节点的树里的Path的最大和,CurSum则表示如果当前的节点并不是最终的根节点,我能得到的最大的路径和(因为不能走分叉所以这两者

是不一样的),用一个变量maxSum记录最大的路径和,最后返回即可。

两点感想:

1.突然想到能否不用递归实现呢?:)不想写了,这里相当于是一个树的先序遍历,那么明显需要用到栈来存储遍历路径。

2.还有就是题目必须读清楚,如果在面试中题目都看不懂,那肯定GG了。

class Solution {
public:
int maxPathSum(TreeNode* root) {
if (root == NULL)
return maxSum;
GetCurTreeSum(root);
return maxSum;
}
int GetCurTreeSum(TreeNode* root)
{
if (root == NULL)
return 0;
if (root->left == NULL && root->right == NULL)
{
CurSum = root->val;
if (CurSum > maxSum)
maxSum = CurSum;
return root->val;
}
int left = GetCurTreeSum(root->left);
int right = GetCurTreeSum(root->right);
if (left > right && left > 0)
CurSum = root->val + left;
else if (right >= left && right > 0)
CurSum = root->val + right;
else
CurSum = root->val;
if (left > 0 && right > 0)
CurMaxPathSum = root->val + left + right;
else if (left > 0 && right <= 0)
CurMaxPathSum = root->val + left;
else if (left <= 0 && right > 0)
CurMaxPathSum = root->val + right;
else
CurMaxPathSum = root->val;
if (CurMaxPathSum > maxSum)
maxSum = CurMaxPathSum;
return CurSum;
}
int maxSum = -INT_MAX;
int CurSum;
int CurMaxPathSum;
};

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值