[二叉树] 二叉树中的最大路径和---leetcode124
1. 题目描述
路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。
路径和 是路径中各节点值的总和。
给你一个二叉树的根节点 root ,返回其 最大路径和 。
2. 思路
对于任意一个节点, 如果最大和路径包含该节点, 那么只可能是两种情况:
1. 其左右子树中所构成的和路径值较大的那个(如果左子树或右子树构成的最大路径和为负数,则置为零,表示最大路径不经过这个子树)加上该节点的值后向父节点回溯构成最大路径,也可能没有左右子树,只有该节点的值往前回溯。
2. 左右子树都在最大路径中, 加上该节点的值构成了最终的最大路径。即,该节点是最大路径的根节点。
递归时,将每个结点作为一个根结点传入递归函数。对于当前的这个结点,以它为根结点,计算它左子树路径的最大和,右子树路径的最大和。通过这个结点,当前是看做是以它根结点,这个结点的最大路径和就是:左子树最大路径和(大于0的话)+右子树最大路径和(大于0的话)+根结点的值。然后更新当前计算的MAX是多少,也就是我们的结果。
递归函数的返回值是:当前这个结点的左子树最大路径和,或者是右子树最大路径和。再加上结点值。因为,这样得到的一条最大路径,就可以作为这个结点的父节点的一条路径,用于父节点的计算。
我们首先考虑什么样的路径可以是最大路径,根据题意,只要是一个结点到另一结点即可。那么我们可以分成两种:
单向路径,即路径中所有的结点都不在同一层,比如示例2中的-10→20→7。
- 双向路径,路径中,以根节点为最高层,左右两个单路径向两边延伸,比如示例二中的答案15←20→7。
我们考虑以每一个结点为根,可以构成的最大单向路径和maxgain为多少,叶节点的maxgain就为它本身的值,其他结点的maxgain则为它自己的值与它左右结点中较大的maxgain之和。
如示例2中,首先15和7的maxgain为本身,然后20的maxgain为20+max(15,7)=35,然后9的maxgain为本身,-10的maxgain为-10+max(9,35)=25。
我们再考虑答案与maxgain的关系,如果以某个点node为路径的根。
- 双向路径的和为 node.val+maxgain(node.left)+maxgain(node,right)
- 单向路径为 node.val+maxgain(node.left) 或 node.val+maxgain(node.right)
我们要找到这个结点为根的最大路径和,那么就是上面三个式子的最大值,而只有在左结点或右结点的maxgain<0,答案才会是下面的式子,所以我们首先判断左右结点的maxgain是不是小于0,如果小于0,置为0,这样就都可以使用上面的式子来表示了。
由于计算路径和的时候,所需的值都是这个节点以及下一层的值,所以在遍历计算maxgain的同一个递归即可完成,只要使用一个全局变量更新结果即可。
注意:最长的路径肯定是属于“从一端的最左侧到这端的最右侧” 这个完整链条的一部分。
3 Python 代码
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = Noneclass Solution:def __init__(self): # 定义一个result属性self.result = float("-inf")def maxPathSum(self, root: TreeNode) -> int:if root == None:return 0self.getMax(root)return self.resultdef getMax(self,root): # 定义一个辅助函数if root == None: # 如果当前节点为空就表示包含当前节点的最大路径为0return 0# 递归的计算当前节点的左子树和右子树能提供的最大路径和,如果为负,就置为零(相当于从头开始)left = max(0,self.getMax(root.left)) right = max(0,self.getMax(root.right))# 注意:最长的路径肯定是属于从一端的最左侧到这端的最右侧的一部分# 每计算一次左右子树的最大值,就更新当前的resultself.result = max(self.result,left + right + root.val)# 往父节点回溯的话,最大路径就不能同时包含左右两个子树,# 因此需要用左右子树较大的那个子树加上当前节点的值进行回溯return max(left,right) + root.val #(递归函数,返回的是回溯需要的式子,而不是返回最终结果(比如这里的 return result))
回溯往往可以用递归来进行实现,当运用递归函数的时候,return的不是函数实现的结果
而是回溯到上层所需要的式子(大部分最终结果和回溯返回所需要的式子是相同的),可能不是这个函数所要实现的最终功能。回溯所需要的式子,以这个题目为例,在定义getMax函数的时候,我们返回的是max(left,right)+ root.val,因为从当前节点回溯到上层父节点的话,需要给上层节点提供由当前节点和某一子树所构成的最大路径和。而最终的结果result是在递归的过程中不断地更新没有作为函数的return。
[二叉树] 二叉树中的最大路径和---leetcode124相关推荐
- 二叉树中的最大路径和—leetcode124
给定一个非空二叉树,返回其最大路径和. 本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列.该路径至少包含一个节点,且不一定经过根节点. 示例 1: 输入: [1,2,3] 1 ...
- leetcode-- 124. 二叉树中的最大路径和
给定一个非空二叉树,返回其最大路径和. 本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列.该路径至少包含一个节点,且不一定经过根节点. 示例 1: 输入: [1,2,3]1/ \2 3输 ...
- leetcode124. 二叉树中的最大路径和
难度困难314 给定一个非空二叉树,返回其最大路径和. 本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列.该路径至少包含一个节点,且不一定经过根节点. 示例 1: 输入: [1,2,3] ...
- LeetCode-124.二叉树中的最大路径和
给定一个非空二叉树,返回其最大路径和. 本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列.该路径至少包含一个节点,且不一定经过根节点. 示例 1: 输入: [1,2,3] 1 / \ 2 ...
- LeetCode实战:二叉树中的最大路径和
背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Given a non ...
- 【练习】树(Tree, UVa 548)给一棵点带权(权值各不相同)的二叉树的中序和后序遍历,找一个叶子使得它到根的路径上的权和最小。
给一棵点带权(权值各不相同,都是小于10000的正整数)的二叉树的中序和后序遍历,找一个叶子使得它到根的路径上的权和最小.如果有多解,该叶子本身的权应尽量小.输入中每两行表示一棵树,其中第一行为中序遍 ...
- 124. Binary Tree Maximum Path Sum 二叉树中的最大路径和
Title 给定一个非空二叉树,返回其最大路径和. 本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列.该路径至少包含一个节点,且不一定经过根节点. 示例 1: 输入: [1,2,3] 1 ...
- 二叉树中的最大路径和
给定一个非空二叉树,返回其最大路径和. 本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列.该路径至少包含一个节点,且不一定经过根节点. 示例 1: 输入: [1,2,3]1/ \2 3输 ...
- [Leedcode][JAVA][第124题][二叉树中的最大路径和][递归][二叉树]
[问题描述][困难] 给定一个非空二叉树,返回其最大路径和.本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列.该路径至少包含一个节点,且不一定经过根节点.示例 1:输入: [1,2,3] ...
最新文章
- Rose VS PowerDesigner
- 一个神级般的 Python 调试神器
- 收集瓶盖赢大奖(信息学奥赛一本通-T1045)
- AI实战!开源一个机器学习/情感分析实战项目(附源码/教程)|湾区人工智能...
- 数据分析/数据挖掘/机器学习---- 必读书目
- VS2008 调试windows服务项目
- 《善用佳软:高效能人士的软件应用之道》一第2章 办公软件:核心应用,实用技巧...
- Vue的axios封装
- 使用无线投屏软件将手机和电脑画面同步
- 数据连接池的工作原理
- js 网页烟花效果
- 开源中国正式进军软件开发众包领域
- 扫雷android设计思路,Flash扫雷游戏设计思路与步骤(4)
- 对话洪小文:微软为什么能够持续保持竞争力和创新力?
- python取值范围_python 数据库取值范围
- Packet Sniffing and Spoofing Lab(报文嗅探欺骗SEED 实验)
- ping网站服务器,ping命令的作用,ping真能检测出服务器的快慢吗??
- 记一次抓取网页内容(二)
- 李彦宏一声「萝卜快跑」,中国首个无人车出行App就位!网友:这才是科技公司该干的事儿...
- linux 限速命令,Linux路由器限速设置详细教程
热门文章
- python报数组越界_python数组越界
- PaddlePaddle应用于百度视觉技术的工程实践
- 在LINQ to SQL中使用Translate方法以及修改查询用SQL
- XenApp_XenDesktop_7.6实战篇之十六:安装Virtual Delivery Agent For Windows Server OS
- URAL 1225 Flags
- Table definition on master and slave does not match
- windows的ftp命令小结
- 广电宽带业务发展的四种策略
- 什么计算机保护,什么是分级保护!!
- python pandas csv读取_如何用 pandas 读取 csv 和 Excel 数据