float最大_Hard 级:二叉树中的最大路径和
今天分析的这道题目,是LeetCode上 Hard 级别的一道题目,虽然代码行数只有 10 来行。
一 先来看看题目
给定一个非空二叉树,返回其最大路径和。本题中,路径被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
示例 1:
输入:[1,2,3]
1
/ \
2 3
输出:6
示例 2:
输入:[-10,9,20,null,null,15,7]
-10
/ \
9 20
/ \
15 7
输出:42
链接:https://leetcode-cn.com/problems/binary-tree-maximum-path-sum
二 分析
这道题目的思路基本可以套用 最大子数组和 ,如果之前并不熟悉最大子数组和的动态规划解法,这道题可能就非常难,关于 最大子数组和,可以参考我昨天整理的完整分析,算是动态规划的入门篇:
动态规划入门篇
最大子数组和,动规解法,可以看作一维的;二叉树子树和,可以看作二维的,思路具有一致性。
最大二叉子树和,也有一个包含当前节点的最大收益定义:current_sum,它被定义为:node.val + max( preOrder(node.left), preOrder(node.right) ),这是二维最大子树问题的关键决策方程,或者状态转移方程。
下面通过题目给出的二叉树为例,解释上面的决策方法:
待求解的二叉树:
自底向上(bottom-up),分别求出每个节点的current_sum,对于叶节点,current_sum等于自身值,但是需要注意:如果current_sum小于0,直接丢弃此节点,认为贡献值为0,所以每个节点的current_sum都是不小于0的:
而节点20的 current_sum 等于:
节点 -10 的 current_sum 等于节点 20 和节点 9 最大值,加上 -10:
这样求解出每一个节点的 current_sum,这部分代码可以写为:
# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None):# self.val = val# self.left = left# self.right = rightclass Solution: def maxPathSum(self, root: TreeNode) -> int: self.best_sum = float('-inf')
def preOrder(node): # 空节点返回 current_sum, 0 if not node: return 0
# preOrder(node.left) current_sum_left = max(preOrder(node.left), 0)# 同理, current_sum_right = max(preOrder(node.right), 0)# 包括当前节点的最大累积和,编个名词,就说包括node节点的最大贡献值 current_sum = node.val + max(current_sum_left,current_sum_right)return current_sum preOrder(root)return self.best_sum
接下来,如何找出最大路径和呢?
我们可以在上面自底向上递归的同时,寻找出每个节点对应的最大路径path_sum,对于node节点的path_sum,通过公式:path_sum = node.val + current_sum_left + current_sum_right 求出,如果current_sum_left 等于0,current_sum_right 等于0,则path_sum等于node.val:
同理,还有如下三种情况:
选择最大的path_sum,就得到最大二叉子树和
三 完整代码
# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None):# self.val = val# self.left = left# self.right = rightclass Solution: def maxPathSum(self, root: TreeNode) -> int: self.best_sum = float('-inf')
def preOrder(node): # 空节点返回 current_sum, 0 if not node: return 0
# preOrder(node.left) current_sum_left = max(preOrder(node.left), 0)# 同理, current_sum_right = max(preOrder(node.right), 0)# 路径的意味就出来了,# 可能4种情况:# 1) 路径只有node节点# 2)3) 仅有左子树、仅有右子树# 4) 都有左、右子树 path_sum = node.val + current_sum_left + current_sum_right # 选择最大的current_sum self.best_sum = max(self.best_sum, path_sum)# 包括当前节点的最大累积和,编个名词,就说包括node节点的最大贡献值 current_sum = node.val + max(current_sum_left,current_sum_right)return current_sum preOrder(root)return self.best_sum
希望此文对大家有帮助!
算法的步骤,有时难以用文字和图片讲清楚,所以我会发布算法短视频到我的视频号:程序员zhenguo,欢迎各位读者一起关注学习。我的目标:讲清楚常用的算法和数据结构,结合图文和动画,真正提升程序的性能,帮助大家晋升为高逼格的程序员,帮助大家顺利进入大厂!!!
程序员zhenguo
我的视频号
float最大_Hard 级:二叉树中的最大路径和相关推荐
- 124. Binary Tree Maximum Path Sum 二叉树中的最大路径和
Title 给定一个非空二叉树,返回其最大路径和. 本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列.该路径至少包含一个节点,且不一定经过根节点. 示例 1: 输入: [1,2,3] 1 ...
- Leetcode 124.二叉树中的最大路径和
124.二叉树中的最大路径和 给定一个非空二叉树,返回其最大路径和. 本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列.该路径至少包含一个节点,且不一定经过根节点. 示例 1: 输入: ...
- NC6 二叉树中的最大路径和
这里写自定义目录标题 题目描述 思路 递归 题目描述 寻找二叉树中从任意节点开始的最大不重复路径和 示例: 输入:{1,2,3} 输出:6 原题链接:NC6 二叉树中的最大路径和 思路 拿到这道题第一 ...
- [LeetCode]124. 二叉树中的最大路径和(java实现)递归
[LeetCode]124. 二叉树中的最大路径和(java实现)递归 1. 题目 2. 读题(需要重点注意的东西) 3. 解法 4. 可能有帮助的前置习题 5. 所用到的数据结构与算法思想 6. 总 ...
- Java实现 LeetCode 124 二叉树中的最大路径和
124. 二叉树中的最大路径和 给定一个非空二叉树,返回其最大路径和. 本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列.该路径至少包含一个节点,且不一定经过根节点. 示例 1: 输入: ...
- 124. 二叉树中的最大路径和
124. 二叉树中的最大路径和: 题目链接 :124. 二叉树中的最大路径和 题目: 路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列.同一个节点在一条路径序列中 至多出 ...
- [二叉树] 二叉树中的最大路径和---leetcode124
1. 题目描述 路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列.同一个节点在一条路径序列中 至多出现一次 .该路径 至少包含一个 节点,且不一定经过根节点. 路径和 是 ...
- 二叉树中的最大路径和
给定一个非空二叉树,返回其最大路径和. 本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列.该路径至少包含一个节点,且不一定经过根节点. 示例 1: 输入: [1,2,3]1/ \2 3输 ...
- LeetCode 124. 二叉树中的最大路径和(DFS)
文章目录 1. 题目信息 2. 解题 1. 题目信息 给定一个非空二叉树,返回其最大路径和. 本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列.该路径至少包含一个节点,且不一定经过根节点 ...
最新文章
- 4 用python进行OpenCV实战之图像变换1(平移)
- 摆摆控件,就可以实现多功能(提交、修改、浏览)的表单了[原]
- ASP.NET MVC增删改查
- Spring Setter依赖注入示例
- @excel 注解_Java中注解学习系列教程-3
- 图解 RoIAlign 以及在 PyTorch 中的使用(含代码示例)
- latex 插入表格_【2020.11.30】IEEE trans英文latex写作心得和学习历程
- 黑客攻防技术宝典web实战篇:工具web服务器习题
- 大用户量下Open***部署方案(二)
- 解决 Chrome最新版右键工具中的编码修改功能没有了的工具
- 解决github下载及访问不稳定问题
- Day14 常用API
- 针对顽固dll后缀文件删除
- Python 语言发展历史
- Apache POI操作Excel文件
- 安卓微信浏览器使用input file图片上传无法触发change事件
- 【“计算机科学与技术”专业小白成长系列】Linux Shell 编程 极简教程
- 网络安全笔记-TCP/IP
- 《Focal Loss GHM Loss Dice Los》论文笔记
- 双十一不去买买买, 广州开发者却high到原地爆炸|活动快报
热门文章
- Zabbix 服务器性能指标参考(学习笔记十七)
- 网站性能优化小结和spring整合redis
- “box-shadow”属性(转)
- 一步步重构容器实现Spring框架——彻底封装,实现简单灵活的Spring框架(十一)...
- 【系列8】使用Dockerfile创建带MongoDB的Centos Docker镜像
- Angular Material 教程之布局篇 (五) : 布局参数
- httpd 服务的两个节点的HA
- 无线传感器网络 | 期末复习知识点1
- cus系统前台改版 beta1.1发布
- C++ operator关键字(重载操作符)(转)