avatar
Binary Tree Maximum Path Sum# JobHunting - 待字闺中
m*1
1
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.
leetcode 上面的一道题,求大神们解释啊
avatar
p*2
2
这题前几天刚讨论过。
avatar
D*f
3
MaxSum(pNode) = max {MaxSum(pNode->L), MaxSum(pNode->R), pNode->V +
MaxTopDown(pNode->L) + MaxTopDown(pNode->R) }
MaxTopDown(pNode) is the max sum of path from root to leaf in this tree.
avatar
m*1
4
MaxTopDown(pNode) 为什么一定要从root 到leaf呢?只要从root开始到任意一个位置
都可以啊

【在 D**f 的大作中提到】
: MaxSum(pNode) = max {MaxSum(pNode->L), MaxSum(pNode->R), pNode->V +
: MaxTopDown(pNode->L) + MaxTopDown(pNode->R) }
: MaxTopDown(pNode) is the max sum of path from root to leaf in this tree.

avatar
b*m
5
树里面可以是任何数?正数?负数?零?
avatar
p*2
6



【在 b***m 的大作中提到】
: 树里面可以是任何数?正数?负数?零?
avatar
p*2
7

你是对的。

【在 m*******1 的大作中提到】
: MaxTopDown(pNode) 为什么一定要从root 到leaf呢?只要从root开始到任意一个位置
: 都可以啊

avatar
l*a
8

你是对的。
====================
真的吗?为什么要root开始呢,任两点都可以啊

【在 m*******1 的大作中提到】
: MaxTopDown(pNode) 为什么一定要从root 到leaf呢?只要从root开始到任意一个位置
: 都可以啊

avatar
t*n
9
贴个我写的代码,将就看了。
int maxPathSum(TreeNode *root) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int max = INT_MIN;
maxPath(root,max);
return max;
}
int maxPath(TreeNode *root,int &max){
if (!root)
return 0;
int l = maxPath(root->left,max);
int r = maxPath(root->right,max);
if ((l+r+root->val)>max){
max = l+r+root->val;
}
int big = l>r?(l+root->val):(r+root->val);
return big>0?big:0;
}
avatar
d*i
10
1. 计算以当前节点为根的subtree的最大值,左右孩子都考虑
2. 更新最终最大值
3. 返回当前节点单条路径所能形成的最大值, 即只考虑一个孩子(如果两个孩子节点
都为负数,则返回当前节点的值)
递归
avatar
p*2
11
int dfs(TreeNode root)
{
if(root==null)
return 0;

int l=dfs(root.left);
int r=dfs(root.right);
int m=root.val;
if(l>0) m+=l;
if(r>0) m+=r;

max=Math.max(max,m);
return Math.max(l,r)>0?Math.max(l,r)+root.val:root.val;
}
avatar
c*t
12
2爷,你的解法和以前人的好像不太一样。关键问题是,如果最大path在左子树中,这
个path要不要经过root? 别人的都不经过,你的似乎经过。

【在 p*****2 的大作中提到】
: int dfs(TreeNode root)
: {
: if(root==null)
: return 0;
:
: int l=dfs(root.left);
: int r=dfs(root.right);
: int m=root.val;
: if(l>0) m+=l;
: if(r>0) m+=r;

avatar
p*2
13

我的应该也不经过吧?

【在 c********t 的大作中提到】
: 2爷,你的解法和以前人的好像不太一样。关键问题是,如果最大path在左子树中,这
: 个path要不要经过root? 别人的都不经过,你的似乎经过。

avatar
c*t
14
你用leetcode oj 测测

【在 p*****2 的大作中提到】
:
: 我的应该也不经过吧?

avatar
p*2
15

你测过吗?

【在 c********t 的大作中提到】
: 你用leetcode oj 测测
avatar
b*m
16
二爷的解法应该是对的,任何子树max为负就不计入。这题应该算是一维数组求最大sum
的变种吧?
avatar
b*m
17
我的这个code貌似跟二爷的意思一样?
int g_nMax = MIN_INT;
int MaxPathSum(Node *pNode)
{
if( !pNode ) return 0;

int nMaxLeft = MaxPathSum(pNode->pLeft);
int nMaxRight = MaxPathSum(pNode->pRight);
int nMaxCurrent = pNode->data + max(0, nMaxLeft) + max(0, nMaxRight);
g_nMax = max(g_nMax, nMaxCurrent);

int nMaxLeftRight = max(nMaxLeft, nMaxRight);
return nMaxLeftRight > 0 ? nMaxLeftRight + pNode->data : pNode->data;
}
avatar
c*t
18
我拿你的测了一下,small cases 20个,10个对,10个错

【在 p*****2 的大作中提到】
:
: 你测过吗?

avatar
p*2
19

不可能吧?我下午刚测过。

【在 c********t 的大作中提到】
: 我拿你的测了一下,small cases 20个,10个对,10个错
avatar
c*t
20
哦,明白了,我测得有问题。
你的这个解太牛了,我花了很久,读了以前的帖子,才明白。理解以后,觉得好简练,
而且其实也很容易理解。
佩服!
有一道变体题,最大路径定义为“两点间最大路径sum1,加上common ancestor到root的
路径。”请问可有好的解?

【在 p*****2 的大作中提到】
:
: 不可能吧?我下午刚测过。

avatar
h*y
21
我测了一下也是 10对10错,
你怎么弄的?哪儿的问题阿?

【在 c********t 的大作中提到】
: 哦,明白了,我测得有问题。
: 你的这个解太牛了,我花了很久,读了以前的帖子,才明白。理解以后,觉得好简练,
: 而且其实也很容易理解。
: 佩服!
: 有一道变体题,最大路径定义为“两点间最大路径sum1,加上common ancestor到root的
: 路径。”请问可有好的解?

avatar
p*2
22

估计你两个都是忘记reset变量了吧?

【在 h**********y 的大作中提到】
: 我测了一下也是 10对10错,
: 你怎么弄的?哪儿的问题阿?

avatar
h*y
23
直接用的你的code阿。。哪里要reset?
int dfs(TreeNode root)
{
if(root==null)
return 0;

int l=dfs(root.left);
int r=dfs(root.right);
int m=root.val;
if(l>0) m+=l;
if(r>0) m+=r;

max=Math.max(max,m);
return Math.max(l,r)>0?Math.max(l,r)+root.val:root.val;
}

【在 p*****2 的大作中提到】
:
: 估计你两个都是忘记reset变量了吧?

avatar
p*2
24

直接就能运行吗?

【在 h**********y 的大作中提到】
: 直接用的你的code阿。。哪里要reset?
: int dfs(TreeNode root)
: {
: if(root==null)
: return 0;
:
: int l=dfs(root.left);
: int r=dfs(root.right);
: int m=root.val;
: if(l>0) m+=l;

avatar
h*y
25
改了dfs函数名
然后加了个max

【在 p*****2 的大作中提到】
:
: 直接就能运行吗?

avatar
m*s
26
可以不可以是空Path?
比如只有一个节点 -3, 那结果是-3 还是0 ?
avatar
w*o
27
二爷节省惯了,能省的都省了。要这么测:
max = Integer.MIN_VALUE;
dfs(root);
return max;
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。