LeetCode刷题 (递归+二叉树)

1.题目描述

给定一个二叉树的根节点 root ,返回其 最大路径和,即所有路径上节点值之和的最大值。

比如root=[-10,9,20,null,null,15,7],最优15+20+7,得到42



LCR 051. 二叉树中的最大路径和 - 力扣(LeetCode)

2.解题思路

给定二叉树,首先想到递归

需要定义结点贡献值,表示子节点和父节点的关系

递归求出各个结点贡献值

递归过程中更新maxSum


3.代码解读

3.1 树结点

定义树结点val+left+right

# 定义二叉树结点
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

3.2 变量maxSum

记录存储最大和的变量

def Solution:
    #用于存储最大和的变量
    def __init__(self):
        self.maxNum=0

3.3 递归函数

算法主体定义一个递归函数,算法只需从maxGain(root)开始即可

def Solution:
    def __init__(self):
        #存储结果的变量
        self.maxSum=0
    
    def maxSum(self,root):
        #定义递归
        def maxGain(node):
            #空结点or非空结点
            if not node:
                return 0
         
            #左右最终贡献
            leftGain=max(maxGain(node.left),0)
            rightGain=max(maxGain(node.right),0)
            #当前结点val+左右子节点Gain
            currentSum=self.val+leftGain+rightGain
            #更新
            self.maxSum=max(self.maxSum,currentSum)
            #val值+子节点贡献值的
            return self.val+max(leftGain,rightGain)
        #递归入口 
        maxGain(root)
        #返回
        return self.maxSum
3.3.1递归方式

每个node进行maxSum时,对left和right进行递归调用

3.3.2 贡献值的定义

贡献值是对父结点“贡献”(要求路径的数值和),node的贡献值=self.val+子节点贡献值较大值

如果计算值为负,父节点在使用时最终取0(避免使用该子结点)

3.3.3 更新方式

currentSum=当前节点val+左右贡献值

比较currentSum与self.maxSum的大小,

如果currentSum较大,将self.maxSum赋值为currentSum的值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值