题目描述

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

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

示例1

        输入:
[1,2,3]1/ \2   3
输出:
6

示例1

        输入:
[-10,9,20,null,null,15,7]-10/ \9  20/  \15   7
输出:
42

题解

这是一道树形 dp 入门题,也就是树上的动态规划。

首先要理解它这个输入什么意思,虽然写代码的时候不用你管,已经给你处理成结构体了。 输入是一个数组,其实是二叉树的层次遍历,也就是从第一层(根结点)开始,往下一层一层遍历结点,同一层从左往右遍历。

这题要求的是一条路径,路径上的数字之和要最大。 我们采用递归来做这题,假设dfs(r)表示以 r 为根结点的子树中最长路径的和,而左右子结点用 l 和 r 来表示

那么有人可能会说,这不是很简单了嘛。 一共就下面几种情况:

  1. 只取根结点:r->val
  2. 只取左子树:dfs(l)
  3. 只取右子树:dfs(r)
  4. 取根结点和左子树:r->val + dfs(l)
  5. 取根结点和右子树:r->val + dfs(r)
  6. 取根结点和左子树和右子树:r->val + dfs(l) + dfs(r)

最后的答案就是dfs(root)

然而这样对吗?其实是错的,刚开始我也犯了这样的错误(好久没做树形 dp 了,见笑了)。 为什么是错的呢?试想这么一种情况,万一左子树的最优解是不经过左子结点的话,怎么与根结点连接起来呢? 这种情况下你的计算就有问题了,所以我们必须加强一下之前的假设。

这次我们假设dfs(r)表示以 r 为根结点的子树中经过根结点 r 的最长路径的和。 现在继续分成上面的几种情况讨论,然而最后的dfs(root)意思变了,指的是必须经过根结点 root 的最优路径之和。 那怎么办呢?很好办,只需要用一个全局变量,每次递归的时候都更新一下最大值就行了,因为总有一个结点是最优路径所在子树的根结点。

分析到这里,貌似都对了,但是还有问题吗? 注意看上面的第2、3、6三种情况,如果最优情况是这三种,然后用它们更新dfs(r),会出现什么情况? 情况2、3会导致回溯之后,在根结点 r 处断开了,也就是不经过 r 了,那再高层也就没法求解了。 而情况6会导致路径出现左右分叉,这也是不允许的。 所以递归的最后更新时,只能用其他三种情况更新。

代码

c++

        /**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {public:int res = INT_MIN;int maxPathSum(TreeNode* root) {dfs(root);return res;}int dfs(TreeNode* root) {if (root == NULL) return 0;int l_max_sum = dfs(root->left);int r_max_sum = dfs(root->right);int sum = root->val;sum = max(sum, sum + l_max_sum);sum = max(sum, sum + r_max_sum);res = max(res, sum);return max({0, l_max_sum, r_max_sum}) + root->val;}
};

python

        # Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = Noneclass Solution:res = -sys.maxsizedef maxPathSum(self, root: TreeNode) -> int:self.dfs(root)return self.resdef dfs(self, root: TreeNode) -> int:if root == None:return 0l_max_sum = self.dfs(root.left)r_max_sum = self.dfs(root.right)sum = root.valsum = max(sum, sum + l_max_sum)sum = max(sum, sum + r_max_sum)self.res = max(self.res, sum)return max(0, l_max_sum, r_max_sum) + root.val

后记

这题虽然是困难题,但是也是树形 dp 的入门题,思考起来和实现起来 trick 还是挺多的。

每日算法系列【LeetCode 124】二叉树中的最大路径和相关推荐

  1. [LeetCode]124. 二叉树中的最大路径和(java实现)递归

    [LeetCode]124. 二叉树中的最大路径和(java实现)递归 1. 题目 2. 读题(需要重点注意的东西) 3. 解法 4. 可能有帮助的前置习题 5. 所用到的数据结构与算法思想 6. 总 ...

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

    124.二叉树中的最大路径和 给定一个非空二叉树,返回其最大路径和. 本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列.该路径至少包含一个节点,且不一定经过根节点. 示例 1: 输入: ...

  3. Java实现 LeetCode 124 二叉树中的最大路径和

    124. 二叉树中的最大路径和 给定一个非空二叉树,返回其最大路径和. 本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列.该路径至少包含一个节点,且不一定经过根节点. 示例 1: 输入: ...

  4. leetcode 124 二叉树中的最大路径和 C语言

    题目 leetcode 124 给定一个非空二叉树,返回其最大路径和. 本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列.该路径至少包含一个节点,且不一定经过根节点. 代码 int ma ...

  5. LeetCode 124. 二叉树中的最大路径和(DFS)

    文章目录 1. 题目信息 2. 解题 1. 题目信息 给定一个非空二叉树,返回其最大路径和. 本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列.该路径至少包含一个节点,且不一定经过根节点 ...

  6. Leetcode 124.二叉树中的最大路径

    解法1 解法 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNo ...

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

    124. 二叉树中的最大路径和: 题目链接 :124. 二叉树中的最大路径和 题目: 路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列.同一个节点在一条路径序列中 至多出 ...

  8. 【LeetCode笔记】124. 二叉树中的最大路径和(Java、二叉树、DFS)

    文章目录 题目描述 思路 & 代码 更新版 题目描述 好家伙我可太激动了,第一次光速A困难题. 应该是因为写过类似的二叉树的直径,不过这道倒是属于简单题.. 面试常考题,刷codetop看到了 ...

  9. 小黑感冒了蒸了桑拿搓了澡的喜茶leetcode之旅:124. 二叉树中的最大路径和

    递归+最大子段和(python) # Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, ...

  10. 重复次数最多的 子串_每日算法系列【LeetCode 424】替换后的最长重复字符

    题目描述 给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次.在执行上述操作后,找到包含重复字母的最长子串的长度. 示例1 输入: s = &quo ...

最新文章

  1. OpenCV代码提取:遍历指定目录下指定文件的实现
  2. 劳力士格林尼治价格_劳力士行情暴跌后回涨,什么时候才是入手的最佳时机?...
  3. 2021-10-7 !二叉树的前序、中序、后序遍历 (递归版本)
  4. CG CTF WEB 综合题
  5. kadane算法_使用KADANE的算法求最大子阵列和
  6. 跟我一起考PMP---项目整合管理
  7. 阿里巴巴泰山版java开发手册最新版.pdf 百度网盘分享
  8. git工作流学习记录
  9. 华为手机Mate20pro打开AP LOG依然无法连接Locat解决办法
  10. 计算机 64虚拟内存设置方法,win7 64位系统虚拟内存设置及虚拟内存太小的影响...
  11. ssm毕设项目基于远程协作的汽车故障诊断系统t6ipg(java+VUE+Mybatis+Maven+Mysql+sprnig)
  12. 数据库(mysql)之事务和存储引擎
  13. 如何清理华为云空间的照片
  14. 安卓手游脚本开发!闭关在家37天“吃透”这份345页PDF,已开源
  15. 网络安全之盗号木马原理
  16. 八零后月薪56K老程序员感慨人生的起起伏伏,跳槽居然没地方让我跳!
  17. 如何在微信里使用计算机,怎么用电脑上微信?教你用电脑如何玩转微信
  18. 慕容不复_拔剑-浆糊的传说_新浪博客
  19. Fedora24!到此一游
  20. web前端优化(加快加载速度,由点滴做起)

热门文章

  1. CSS3 必须要知道的10 个顶级命令
  2. linux网络 (三):网络测试
  3. ubuntu 12.04下gedit查看txt中文乱码解决办法
  4. Java语法基础学习DayNineteen(反射机制)
  5. [历朝通俗演义-蔡东藩-前汉]第008回 葬始皇骊山成巨冢 戮宗室豻狱构奇冤
  6. linux回到上次目录与历史命令查找快捷方式
  7. 一个高性能RPC框架的连接管理
  8. 故障常见原因归类分析及预防和应对措施
  9. MySql is marked as crashed and should be repaired问题
  10. struts的action属性自动注入原理