腾讯38-二叉树中的最大路径和

腾讯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
发布了93 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/zlb872551601/article/details/103650201