LeetCode 124. 二叉树中的最大路径和 | Python

124. 二叉树中的最大路径和


题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/binary-tree-maximum-path-sum

题目


给定一个非空二叉树,返回其最大路径和。

本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。

示例 1:

输入: [1,2,3]

       1
      / \
     2   3

输出: 6

示例 2:

输入: [-10,9,20,null,null,15,7]

   -10
   / \
  9  20
    /  \
   15   7

输出: 42

解题思路


思路:递归

题目中所给出的路径概念是指【一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点】。

也就是说,要求出路径和,得计算节点能提供的最大贡献值。

对于节点能提供的贡献值,分为如下部分:

  • 空节点提供的贡献值为 0;
  • 对于非空节点提供的贡献值,等于当前节点的值与其子节点中提供最大贡献值的和。

现在以示例 1 来分析说明下:

输入: [1,2,3]

       1
      / \
     2   3

在这里叶子节点 2,3,能提供的贡献值就是 2, 3。

而叶子节点 1,能够提供的贡献值为 1+21+3

那我们假设:如果节点 1 前面还有父节点,那么这里可能的路径就会变成:

  • 2 + 1 + 3
  • 2 + 1 + 1 的父节点
  • 3 + 1 + 1 的父节点

其中第一种情况,就是求节点的最大路径和。这里节点的最大路径和取决于该节点与其左右子节点的最大贡献值之和。当然,在这里,如果子节点的贡献值为负,则选择不纳入。因为负数的贡献值添加进来反而会让结果变小。

对于第二种和第三种情况来说,这里就是递归求得左右子节点的贡献值,从中取更优的方案。

这里最主要的就是维护一个存储最大路径和的变量 max_path_sum,递归的过程中维护更新这个值,从而求得最大值。

具体的代码实现如下。

代码实现


# 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.max_path_sum = float('-inf')

    def maxPathSum(self, root: TreeNode) -> int:
        def max_contr(node):
            # 递归求节点最大贡献值
            # 同时维护经过节点的最大路径和
            # 空节点的贡献值为 0
            if not node:
                return 0

            # 递归计算左子节点的贡献值,
            left = max(0, max_contr(node.left))
            # 递归计算右子节点的贡献值
            right = max(0, max_contr(node.right))

            # 经过当前节点的最大路径和
            self.max_path_sum = max(self.max_path_sum, left + node.val + right)

            # 当前节点的贡献值,取左右子节点中的更优方案
            node_contr = node.val + max(0, max(left, right))
            # 这里返回的贡献值是给当前节点的上游节点
            return node_contr

        max_contr(root)
        return self.max_path_sum

实现结果


实现结果

总结


  • 从题目中得到的信息可以知道,要求最大路径和,需要求得节点能够提供的贡献值。
  • 对于节点而言,提供的贡献值分为两部分:
    • 空节点的贡献值为 0;
    • 对于非空节点而言,当前节点能提供的贡献值为当前节点的值与其子节点中能提供的最大贡献值之和
  • 对于非空节点而言,我们需要递归的方法求得每个节点的贡献值。同时,需要维护最大路径和,在这里,该节点的路径和取决于当前节点的值与其左右子节点的最大贡献值。
  • 这里需要注意:当贡献值为负时,不计入节点的最大路径和。

文章原创,如果觉得写得还好,欢迎关注点赞。微信公众号《书所集录》同步更新,同样欢迎关注点赞。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335