二叉树最大路径和
题目:🔗
分析:
这个分析思路来源于leetcode上一个非常清晰的解析。链接在这https://leetcode-cn.com/problems/binary-tree-maximum-path-sum/comments/ @丁玉松
根据当前节点的角色,路径和可分为两种情况:
- 以当前节点为根节点
- 当前节点为最大值
- 当前节点+左子树为最大值
- 当前节点+右子书为最大值
- 当前节点+左子树+右子树为最大值
- 以当前节点为父节点的一个子节点(和父节点连接需要取单端的最大值)
- 只有当前节点
- 当前节点+左子树
- 当前节点+右子书
ps: 不可能当前节点+左右子树,这样再和父节点连接,会出现分叉,导致重复走路径!这也是为什么返回时,只返回最后前3种情况,要获得全局最大值,需要尝试和父节点相连后的结果。
记住用一个变量记录全局最大路径值!
import sys
class Solution:
# 终于知道怎么取最大值了 想哭!
result = -sys.maxsize - 1
def maxPathSum(self, root: TreeNode) -> int:
# 二叉树最大路径和 等价于 图的最大路径和 等价于 图的多源最大路径和 问题是如何建邻接矩阵 二叉树建邻接矩阵 没搞过。。
# 我记得当初看题解都看不太懂
# 从简单的开始 二叉树问题 其实就是
self.maxValues(root)
return self.result
def maxValues(self, root):
'''
抛开皮肉看构造, 这tm不就是一道后续遍历题吗?
'''
if not root:
return 0
rootVal = root.val
# 拿到左子树的最大树
leftValue = self.maxValues(root.left)
# 拿到右子树的最大值
rightValue = self.maxValues(root.right)
val1 = rootVal + leftValue
val2 = rootVal + rightValue
val3 = rootVal + leftValue + rightValue
# 求这4种情况的最大值
maxValue = max([val1, val2, val3, rootVal])
# 记录目前的最大值
self.result = max(self.result, maxValue)
# 路径要和父节点关联,则需要去除情况4的最大值
return max(rootVal, val1, val2)