二叉树路径和要注意几个特殊情况:
1)只有一个根节点且为负数,此时返回的应该是该结点值而非0
2)返回上一层结点时,该结点只能选择一支子树的值,即路径是一条不回头的路。
3)可以不经过根节点,选择整棵树中最大路径和即可。
(上述三种情况对应以下例图,图源来自花花酱)
采用递归解决该问题,代码如下:
class Solution:
def maxPathSum(self, root):
self.result = float("-inf")
self._maxPathSum(root)
return self.result
def _maxPathSum(self, root):
if root is None:
return float("-inf")
left = max(0, self._maxPathSum(root.left))
right = max(0, self._maxPathSum(root.right))
self.result = max(self.result, left + right + root.val)
return root.val + max(left, right)
注意:
1)result一定要设置为全局变量且可以被除了本函数以外的函数调用,否则_maxPathSum函数无法调用修改值。
2)result记录目前为止最大的路径和,但若回溯至上一层结点需要返回的是该结点和选取的一支子树(路径和最大的一支子树)的路径和。如此反复,不断比较当前最大路径和与回溯到上一层结点的最大路径和,从而找到全树的最大路径和(该路径可不经过根结点)。