二叉树中的最大路径和

二叉树中的最大路径和(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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值