二叉树中的最大路径和(python年度更新系列)
路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。
路径和 是路径中各节点值的总和。
给你一个二叉树的根节点 root ,返回其 最大路径和 。
输入:root = [1,2,3]
输出:6
解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6
本题的主题思路是后续遍历,通过递归查找左右子树的最大路径去求解这道题。
二叉树的递归遍历的主心骨:
def dfs(root):
if root is None:
return
dfs(root.left)
dfs(root.right)
本体的主要两个思想在于:
1、实时的修改最大路径。
2、每次dfs都会将dfs的结点进行修改。
下面的语句实现了每次将最大值更新为遍历结点的最大路径和,从底层开始遍历因为不一定包含根节点。
self.maxsum = max(self.maxsum,left + right + root.val)
下面的语句则是连接路径,遍历的结点为与之的孩子结点之和小于0时直接舍弃,返回0,否则的话记录下来该路径的最大值并记录在val中,逻辑上实现了路径的连同或者舍弃
return max(0,max(left,right)+root.val)
本题的解法具体如下:
class Solution(object):
def maxPathSum(self, root):
#全局变量,用来更新最大值
self.maxsum = root.val
#至少包含一个结点,因此初始直接放置root.val而不放置0,避免只有一个根节点且值为负
def dfs(root):
if root is None:
return 0
#根节点为空时,直接返回0
left = dfs(root.left)
right = dfs(root.right)
self.maxsum = max(self.maxsum,left + right + root.val)
#实时修改dfs时的路径最大值
return max(0,max(left,right)+root.val)
dfs(root)
return self.maxsum