热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

leetcode124.二叉树中的最大路径和(Python3)

文章目录leetcode124.二叉树中的最大路径和方法:递归思路:代码:结果:leetcode124.二叉树中的最大路径和

文章目录

  • leetcode124. 二叉树中的最大路径和
    • 方法:递归
      • 思路:
      • 代码:
      • 结果:


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

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

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

示例 1:

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

示例 2:

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



方法:递归


思路:

我们首先考虑什么样的路径可以是最大路径,根据题意,只要是一个结点到另一结点即可。那么我们可以分成两种:

  • 单向路径,即路径中所有的结点都不在同一层,比如示例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。

由上面的过程可以看出,这是一个从下到上的计算过程,因此用DFS递归可以完成计算。

我们再考虑答案与maxgain的关系,如果以某个点node为路径的根,那么双向路径的和为

node.val+maxgain(node.left)+maxgain(node,right);

单向路径为

node.val+maxgain(node.left)或node.val+maxgain(node.right)。

我们要找到这个结点为根的最大路径和&#xff0c;那么就是上面三个式子的最大值&#xff0c;而只有在左结点或右结点的maxgain<0&#xff0c;答案才会是下面的式子&#xff0c;所以我们首先判断左右结点的maxgain是不是小于0&#xff0c;如果小于0&#xff0c;置为0&#xff0c;这样就都可以使用上面的式子来表示了。

由于计算路径和的时候&#xff0c;所需的值都是这个节点以及下一层的值&#xff0c;所以在遍历计算maxgain的同一个递归即可完成&#xff0c;只要使用一个全局变量更新结果即可。

代码&#xff1a;

# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val &#61; x
# self.left &#61; None
# self.right &#61; Noneclass Solution:def __init__(self):self.res &#61; float(&#39;-inf&#39;)def maxPathSum(self, root: TreeNode) -> int:#该函数返回root为根的最大单项路径长度和&#xff0c;同时更新答案self.resdef maxgain(root):if not root:return 0#获取root的左右结点的最大单路径和&#xff0c;如果小于0则忽略 left &#61; max(maxgain(root.left),0)right &#61; max(maxgain(root.right),0)#以root为根&#xff0c;加上左右两个最大路径即为以root为根的最大双向路径和&#xff08;有一个为0时为单向路径&#xff09;summ &#61; root.val &#43; left &#43; right#更新最大值self.res &#61; max(self.res,summ)return root.val &#43; max(left,right)maxgain(root)#返回答案return self.res

结果&#xff1a;


推荐阅读
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 本实验主要探讨了二叉排序树(BST)的基本操作,包括创建、查找和删除节点。通过具体实例和代码实现,详细介绍了如何使用递归和非递归方法进行关键字查找,并展示了删除特定节点后的树结构变化。 ... [详细]
  • 利用决策树预测NBA比赛胜负的Python数据挖掘实践
    本文通过使用2013-14赛季NBA赛程与结果数据集以及2013年NBA排名数据,结合《Python数据挖掘入门与实践》一书中的方法,展示如何应用决策树算法进行比赛胜负预测。我们将详细讲解数据预处理、特征工程及模型评估等关键步骤。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 本文详细介绍了Java中org.w3c.dom.Text类的splitText()方法,通过多个代码示例展示了其实际应用。该方法用于将文本节点在指定位置拆分为两个节点,并保持在文档树中。 ... [详细]
  • 本文探讨了如何优化和正确配置Kafka Streams应用程序以确保准确的状态存储查询。通过调整配置参数和代码逻辑,可以有效解决数据不一致的问题。 ... [详细]
  • 机器学习中的相似度度量与模型优化
    本文探讨了机器学习中常见的相似度度量方法,包括余弦相似度、欧氏距离和马氏距离,并详细介绍了如何通过选择合适的模型复杂度和正则化来提高模型的泛化能力。此外,文章还涵盖了模型评估的各种方法和指标,以及不同分类器的工作原理和应用场景。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 本文探讨了《魔兽世界》中红蓝两方阵营在备战阶段的策略与实现方法,通过代码展示了双方如何根据资源和兵种特性进行战士生产。 ... [详细]
  • 本题通过将每个矩形视为一个节点,根据其相对位置构建拓扑图,并利用深度优先搜索(DFS)或状态压缩动态规划(DP)求解最小涂色次数。本文详细解析了该问题的建模思路与算法实现。 ... [详细]
  • 本文详细介绍了如何在 Windows 环境下使用 node-gyp 工具进行 Node.js 本地扩展的编译和配置,涵盖从环境搭建到代码实现的全过程。 ... [详细]
  • 尽管深度学习带来了广泛的应用前景,其训练通常需要强大的计算资源。然而,并非所有开发者都能负担得起高性能服务器或专用硬件。本文探讨了如何在有限的硬件条件下(如ARM CPU)高效运行深度神经网络,特别是通过选择合适的工具和框架来加速模型推理。 ... [详细]
  • 本文将详细探讨Linux pinctrl子系统的各个关键数据结构,帮助读者深入了解其内部机制。通过分析这些数据结构及其相互关系,我们将进一步理解pinctrl子系统的工作原理和设计思路。 ... [详细]
  • 本题探讨了在大数据结构背景下,如何通过整体二分和CDQ分治等高级算法优化处理复杂的时间序列问题。题目设定包括节点数量、查询次数和权重限制,并详细分析了解决方案中的关键步骤。 ... [详细]
author-avatar
A_2na轻奢主义总店访烟
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有