Leetcode刷题记录——124. 二叉树中的最大路径和

Leetcode刷题记录——124. 二叉树中的最大路径和_第1张图片
没明白为什么这道题是困难QAQ
其实不难,想明白下面几个问题就好
1、整个树的最大路径和可能存在于任何一个局部,如示例2中结果42出现在root的右子树中
因此,应使用递归,当递归到一个节点时,要以该节点作为root,计算一下是否会出现独立的结果
2、递归到某一个点的时候,我们要求的,一定是经过当前点的最大和路径
注意,我们无法保证该路径一定是最大和路径,因此每次应和一个全局变量相比较
3、我们递归返回给上一个节点的结果只能是
a自己的值
b自己的值+左子树的递归结果
c自己的值+右子树的递归结果
不能反悔自己的值+左子树的递归结果+右子树的递归结果,因为此时会产生分叉,就不是一条路径了

想明白上述内容以后,代码很简单

# 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.res = None
    def maxPathSum(self, root: TreeNode) -> int:
        self.func(root)
        return self.res    
    def func(self,root):
        if root == None:
            return 0
        resl = self.func(root.left)
        resr = self.func(root.right)
        tempmax = max(resl+root.val,resr+root.val,resl+resr+root.val,root.val)#经由当前节点的最大和路径
        self.res = max(self.res,tempmax) if self.res != None else tempmax#和全局最大和路径比较
        return max(root.val+resl,root.val+resr,root.val)#返回给上一层节点的只能是这三种情况,不可以是左+自己+右

你可能感兴趣的:(leetcode,python编程技巧)