近期为了准备笔试开始刷leetcode,记录一下希望自己可以坚持!
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
.
以上是题目
一开始我把题目理解错误,导致多次提交都是出错,经过各种搜索终于了解了这个题目的本意。(很奇怪,为什么不提供更详细的测试用例,这样也可以减少理解障碍不是 :-))
(一)题目要求分析:
1、路径最大和值包括;节点,节点+左子树,节点+右子树,其中一个,当左右子树有一个为零时,我们就舍弃这个子点,这也是我们创建递归函数的返回值。
2、当前函数包含一个变量maxSum来记录最大值,maxSum等于当前节点的,节点与左右子节点可以得到的最大值与函数返回值中大的那一个。
举例如下:
1
/ \
2 3
/ \ / \
4 -5 6 7
左子树的函数返回值为(2,4)= 6; 而此时可以得出maxSum为(1,2,4) = 7.
(二)解题技巧:
1、从根节点开始遍历访问左右子树,分别寻至叶子节点。
2、注意区分返回值与最大值的区别。
上AC代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
int ans;
int max(int a, int b)
{
if(a > b)
return a;
else
return b;
}
int help(struct TreeNode *root)
{
int ret, lsum, rsum;
if(root == NULL)
return 0;
ret = root->val;
lsum = help(root->left);
rsum = help(root->right);
if(lsum > 0) ret += lsum;
if(rsum > 0) ret += rsum;
if(ret > ans) ans = ret;
return max(root->val, max(root->val + lsum, root->val + rsum));
}
int maxPathSum(struct TreeNode* root)
{
ans = root->val;
help(root);
return ans;
}
参考博客:
[LeetCode 124] - 二叉树最大路径和(Binary Tree Maximum Path Sum)