我试图找到二叉树的最大路径总和,这是Leetcode上的问题124。有人可以帮我“返回最大值(左,右,root.val)”做什么吗?在“ maxPathSum”或“ diameterHelper”函数中的何处使用?非常感谢!!
[1]: https://i.stack.imgur.com/liGMD.png
class Solution:
def maxPathSum(self, root):
max_so_far = [root.val]
def diameterHelper(root, max_so_far):
if root.left == None and root.right == None:
print(root.val)
#print(max_so_far)
if root.val > max_so_far[0]:
max_so_far[0] = root.val
# print("222222")
return root.val
left, right = root.val, root.val
if root.left is not None:
left = root.val + diameterHelper(root.left, max_so_far)
#print(left)
if root.right is not None:
right = root.val + diameterHelper(root.right, max_so_far)
#print(max_so_far)
#print(root.val)
cur_max = left + right - root.val
if cur_max > max_so_far[0]:
max_so_far[0] = cur_max
if root.val > max_so_far[0]:
max_so_far[0] = root.val
if left > max_so_far[0]:
max_so_far[0] = left
if right > max_so_far[0]:
max_so_far[0] = right
#print(1)
#print(max_so_far[0])
return max(left, right, root.val)
diameterHelper(root, max_so_far)
return max_so_far[0]
答案 0 :(得分:0)
函数diameterHelper
返回从当前节点(不幸地称为root
)开始并经过二叉树的最大路径总和。它还会更新max_so_far
变量的值,但这与您的问题无关。
在某一时刻,变量left
设置为从当前节点开始并经过当前节点的左子节点进入二叉树的最大路径总和。类似地,变量right
设置为从当前节点开始并经过当前节点的右子节点进入二叉树 的路径的最大和。
在函数``的末尾,您的行return max(left, right, root.val)
被执行。这意味着从当前节点向下的最大路径总和具有三种可能性。它可以是通过左孩子的路径,也可以是通过右孩子的路径。另一种可能性是,最大路径不会通过任何一个子节点,这意味着它只是一个节点(即当前节点)的最简单路径。当没有子节点或任何一个子节点的所有路径的和为负时,就会发生这种情况。
因此,该行将检查所有三种可能性,从这三种可能性中选择最大的路径总和,然后将该值返回给调用函数。因此,该函数确实的确返回了从当前节点向下的最大路径总和。
在某些时候,将检查最大和路径中的最高级别节点。然后,将从该节点开始向下的两个最大路径长度进行求和并求和,以得到子树中的最大总和路径长度。这与以前的最大值不同,因为此路径不一定要从当前节点开始下来,它只是通过当前节点通过。