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相关推荐

  1. 二叉树中的最大路径和—leetcode124

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

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

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

  3. leetcode124. 二叉树中的最大路径和

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

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

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

  5. LeetCode实战:二叉树中的最大路径和

    背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Given a non ...

  6. 【练习】树(Tree, UVa 548)给一棵点带权(权值各不相同)的二叉树的中序和后序遍历,找一个叶子使得它到根的路径上的权和最小。

    给一棵点带权(权值各不相同,都是小于10000的正整数)的二叉树的中序和后序遍历,找一个叶子使得它到根的路径上的权和最小.如果有多解,该叶子本身的权应尽量小.输入中每两行表示一棵树,其中第一行为中序遍 ...

  7. 124. Binary Tree Maximum Path Sum 二叉树中的最大路径和

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

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

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

  9. [Leedcode][JAVA][第124题][二叉树中的最大路径和][递归][二叉树]

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

最新文章

  1. Rose VS PowerDesigner
  2. 一个神级般的 Python 调试神器
  3. 收集瓶盖赢大奖(信息学奥赛一本通-T1045)
  4. AI实战!开源一个机器学习/情感分析实战项目(附源码/教程)|湾区人工智能...
  5. 数据分析/数据挖掘/机器学习---- 必读书目
  6. VS2008 调试windows服务项目
  7. 《善用佳软:高效能人士的软件应用之道》一第2章 办公软件:核心应用,实用技巧...
  8. Vue的axios封装
  9. 使用无线投屏软件将手机和电脑画面同步
  10. 数据连接池的工作原理
  11. js 网页烟花效果
  12. 开源中国正式进军软件开发众包领域
  13. 扫雷android设计思路,Flash扫雷游戏设计思路与步骤(4)
  14. 对话洪小文:微软为什么能够持续保持竞争力和创新力?
  15. python取值范围_python 数据库取值范围
  16. Packet Sniffing and Spoofing Lab(报文嗅探欺骗SEED 实验)
  17. ping网站服务器,ping命令的作用,ping真能检测出服务器的快慢吗??
  18. 记一次抓取网页内容(二)
  19. 李彦宏一声「萝卜快跑」,中国首个无人车出行App就位!网友:这才是科技公司该干的事儿...
  20. linux 限速命令,Linux路由器限速设置详细教程

热门文章

  1. python报数组越界_python数组越界
  2. PaddlePaddle应用于百度视觉技术的工程实践
  3. 在LINQ to SQL中使用Translate方法以及修改查询用SQL
  4. XenApp_XenDesktop_7.6实战篇之十六:安装Virtual Delivery Agent For Windows Server OS
  5. URAL 1225 Flags
  6. Table definition on master and slave does not match
  7. windows的ftp命令小结
  8. 广电宽带业务发展的四种策略
  9. 什么计算机保护,什么是分级保护!!
  10. python pandas csv读取_如何用 pandas 读取 csv 和 Excel 数据