乍一看这是一道困难题,但可能因为最近做的关于树的题目比较多,所以其实并没有真正意义上觉得特别困难,很多别的类型的中等题感觉比这还要难。
题意:一棵非空二叉树,节点可正可负可为零,求最大路径和
- 最开始的想法还是递归,其实也有一点动态规划的思想
从根节点开始,依次计算子树包含子树根节点的最大路径和,保证了能够连成一条通路
包含该子树根节点的最大路径和:左子树最大路径和(if>0)+根节点+右子树最大路径和(if>0)
判断该子树最大路径和是否大于目前的最大值,是则替换
提交后有一些错了 - 然后发现有一个小问题,如果一个子树同时加了左子树和右子树的最大路径,就不能继续往上一级根节点加了,因此return的值不能是“左子树最大路径和(if>0)+根节点+右子树最大路径和(if>0)”,而应该改成“根节点+ max(左子树最大路径和, 右子树最大路径和)(if>0)”,这样就可以了~
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def __init__(self):
self.ans = -1000000000
def maxPathSum(self, root: TreeNode) -> int:
def findMax(tree: TreeNode):
res = tree.val
x = 0
y = 0
if tree.left:
x = findMax(tree.left)
if x > 0:
res += x
if tree.right:
y = findMax(tree.right)
if y > 0:
res += y
if res > self.ans:
self.ans = res
x = x if x > y else y
return tree.val + x if x > 0 else tree.val
total = findMax(root)
return self.ans