[LeetCode] Binary Tree Maximum Path Sum
2014-01-17 08:18
197 查看
问题:
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,
Return
分析:
首先,这道题的解决方案是用递归。对于一棵树来说,maximum path可能是经过root、贯穿左右的一条path;有可能是一条经过root但不贯穿的path(只有左边或者只有右边);也由可能是一条只在一边的path。但值得注意的是,如果是一条贯穿左右的path,则在我们recurse on left subtree and right subtree的时候,一定要选择第二种情况,即经过root但不管穿的path,把他们组合起来才变成一条贯穿的。所以,代码如下。
代码:
class Solution {
public:
int maxPathSumHelper(TreeNode *root, int &result) {
if (!root)
return 0;
int l = maxPathSumHelper(root->left, result);
int r = maxPathSumHelper(root->right, result);
int arch = l + r + root->val;
int single = max(root->val, max(l + r) + root->val);
result = max(result, max(arch, single));
return single;
}
int maxPathSum(TreeNode *root) {
int result = INT_MIN;
if (!root) return 0;
maxPathSumHelper(root, result);
return result;
}
};
注意,maxPathSumHelper返回的是single。这就是我上面说的原因:因为我们要用这个返回值来组合一条arch,所以必须是single。但也不用担心,因为我们早在上一行就已经把max放在了result里面,所以没关系。这个递归稍稍不同于一般的递归:它的返回值和我们真正要的东西不是用一个东西。这里的返回值是用来进一步递归的,而不是真正我们需要返回的东西。
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.
分析:
首先,这道题的解决方案是用递归。对于一棵树来说,maximum path可能是经过root、贯穿左右的一条path;有可能是一条经过root但不贯穿的path(只有左边或者只有右边);也由可能是一条只在一边的path。但值得注意的是,如果是一条贯穿左右的path,则在我们recurse on left subtree and right subtree的时候,一定要选择第二种情况,即经过root但不管穿的path,把他们组合起来才变成一条贯穿的。所以,代码如下。
代码:
class Solution {
public:
int maxPathSumHelper(TreeNode *root, int &result) {
if (!root)
return 0;
int l = maxPathSumHelper(root->left, result);
int r = maxPathSumHelper(root->right, result);
int arch = l + r + root->val;
int single = max(root->val, max(l + r) + root->val);
result = max(result, max(arch, single));
return single;
}
int maxPathSum(TreeNode *root) {
int result = INT_MIN;
if (!root) return 0;
maxPathSumHelper(root, result);
return result;
}
};
注意,maxPathSumHelper返回的是single。这就是我上面说的原因:因为我们要用这个返回值来组合一条arch,所以必须是single。但也不用担心,因为我们早在上一行就已经把max放在了result里面,所以没关系。这个递归稍稍不同于一般的递归:它的返回值和我们真正要的东西不是用一个东西。这里的返回值是用来进一步递归的,而不是真正我们需要返回的东西。
相关文章推荐
- 动易2006序列号破解算法公布
- PHP程序员面试 切忌急功近利(更需要注重以后的发展)
- C#数据结构与算法揭秘二
- 浅析STL中的常用算法
- JavaScript 组件之旅(二)编码实现和算法
- php 面试碰到过的问题 在此做下记录
- asp.net 面试+笔试题目第1/2页
- asp.net 面试 笔试题目[附答案]第1/3页
- 将15位身份证补全为18位身份证的算法示例详解
- C++算法系列之日历生成的算法代码
- 1 2 3 4 5 6 7 8 9 = 110的java实现
- Sedgewick之巨著《算法》,与高德纳TAOCP一脉相承
- 【代码】Pythonの代码片段
- 面试:(设计,架构)
- STL中算法
- 数据结构&算法学习
- 算法的时间复杂度
- 算法导论:选择排序的原理与实现
- PHP实现四种常用的排序算法
- 图解插入排序算法