【发布时间】:2020-11-03 16:16:04
【问题描述】:
给定一棵二叉树,其中每个节点元素都包含一个数字。找出从一个叶节点到另一个叶节点的最大可能总和。
示例 1:
Input :
3
/ \
4 5
/ \
-10 4
Output: 16
说明: 最大和位于叶节点 4 和 5 之间。 4 + 4 + 3 + 5 = 16。
示例 2:
Input :
-15
/ \
5 6
/ \ / \
-8 1 3 9
/ \ \
2 -3 0
/ \
4 -1
/
10
Output : 27
说明: 一个叶子节点的最大可能和 另一个是 (3 + 6 + 9 + 0 + -1 + 10 = 27)
这是解决方案:
'''
# Node Class:
class Node:
def _init_(self,val):
self.data = val
self.left = None
self.right = None
'''
res = -999999999
def maxPathSumUtil(root):
global res
if root is None:
return 0
if root.left is None and root.right is None:
return root.data
ls=maxPathSumUtil(root.left)
rs=maxPathSumUtil(root.right)
if root.left and root.right:
res=max(res,ls+rs+root.data)
return max(ls+root.data,rs+root.data) #Line: Problem
if root.left is None:
return rs+root.data
else:
return ls+root.data
def maxPathSum(root):
global res
res = -999999999
maxPathSumUtil(root)
return res
谁能告诉我为什么我们使用return max(ls+root.data,rs+root.data)。如果我们确实使用return max(ls+root.data,rs+root.data) 来检查最大值,那么为什么我们使用res=max(res,ls+rs+root.data) 而不仅仅是 res = max(ls+root.data,rs+root.data)。
编辑:
例如:
Let's take this tree for example:
10
/ \
8 2
/ \
3 5
在此,递归调用后,ls 变为 3,rs 变为 5。
res 变为 ls+rs+root.data,即 3+5+8 = 16。
然后return max(ls+root.data,rs+root.data) 即 max(11,13) = 13。
现在根据我的说法,该函数应该只返回 13 但这不会发生。即使return 不是递归语句。代码的控制流程是如何发生的?
【问题讨论】:
-
2个叶子节点之间的路径也涉及到根节点。请注意,根也可以是子树的子根,不一定要通过树的实际根。
标签: python algorithm data-structures tree