腾讯38-二叉树中的最大路径和#leetcode124
给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
示例 1:
输入: [1,2,3]
1
/ \
2 3
输出: 6
示例 2:
输入: [-10,9,20,null,null,15,7]
-10
/
9 20
/
15 7
输出: 42
hard级别,不好理解,
参考花花酱视频,
代码容易写错
ans更新时考虑左右,
一个结点的结果,只能选左或者右
分析
对于如下所示的树:
a
/ \
b c
/ \ / \
d e f g
最大和的路径基本只有以下几种情况:
- 某个节点自身
- 形如 d-b-e 这种 以某节点 b 为根节点的”完全子树“(选择的节点要么左右孩子也都加入,要么都不加入)
- 形如 d-b-a-c-f 这种含有”不完全子树“(如没有加入b的右孩子e,c的右孩子g)
因此,采取递归的思想,先遍历到叶子节点,逐层返回当前分支最大路径和。
如果最大路径是1或者2情况的话,那么是不需要回溯的,也就是说,对于1和2只需要判断root+left+right这一路径和是否为最大路径即可,不必向上层返回值;而3则需要继续判断当前 root+left或者root+right是否为最终路径的左或右分支(如d-b是d-b-a-c-f的左分支),因此需要回溯时需要返回root+left和root+right其中的最大值,如果root的左右孩子都是负数,那么当前子路径就是root节点本身,即返回root即可。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def _maxPathSum(self, root) :
if root is None:return float('-inf')
#经过左节点的路径的最大和
l=max(0,self._maxPathSum(root.left))
#经过右节点的路径的最大和
r=max(0,self._maxPathSum(root.right))
#以当前节点为根节点的路径最大和
self.ans=max(self.ans,root.val+l+r)
#返回 经过当前节点的路径最大和
return max(l,r)+root.val
def maxPathSum(self, root: TreeNode) -> int:
#hard级别
self.ans=float('-inf')
self._maxPathSum(root)
return self.ans