124. 二叉树中的最大路径和
https://leetcode-cn.com/problems/binary-tree-maximum-path-sum/
解法一:递归遍历
对于任意一个节点node, 如果最大和路径包含该节点, 那么只可能是两种情况: 1. node的左右子树中所路径和较大的,加上node的值后向node父节点回溯构成最大路径(若向父节点回溯,则左右分支只能选一个,因为不能回路) 2. 左右子树都在最大路径中, 加上node的值构成了最终的最大路径。
naive的思路,(有bug:
class Solution:
def maxPathSum(self, root: TreeNode) -> int:
self.maxSum = -sys.maxsize
self.getMax(root)
return self.maxSum
def getMax(self, root):
if not root:
return 0
left = self.getMax(root.left)
right = self.getMax(root.right)
self.maxSum = max(self.maxSum, left+right+root.val)
return max(left, right) + root.val
这个解法对case[2, -1]失效,返回1而正确答案为2。因为若node的左右子树路径和小于0,对node的贡献就为负,应该不取。
正确解法:
class Solution:
def maxPathSum(self, root: TreeNode) -> int:
self.maxSum = -sys.maxsize #用一个全局maxSum记录最大路径和,先预设为最小整数
self.getMax(root)
return self.maxSum
def getMax(self, root):
if not root:
return 0
#对左右子树递归
left = max(0, self.getMax(root.left)) #如果子树路径和为负则应当置0表示最大路径不包含子树
right = max(0, self.getMax(root.right))
#判断在该节点包含左右子树的路径和是否大于当前最大路径和
self.maxSum = max(self.maxSum, root.val + left + right)
#注意!该节点对上一层的返回值,只能是该节点值加上左子树(或右子树),因为不可能产生回路
return root.val + max(left, right)
最后更新于