热门标签 | 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;


推荐阅读
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 本实验主要探讨了二叉排序树(BST)的基本操作,包括创建、查找和删除节点。通过具体实例和代码实现,详细介绍了如何使用递归和非递归方法进行关键字查找,并展示了删除特定节点后的树结构变化。 ... [详细]
  • 利用决策树预测NBA比赛胜负的Python数据挖掘实践
    本文通过使用2013-14赛季NBA赛程与结果数据集以及2013年NBA排名数据,结合《Python数据挖掘入门与实践》一书中的方法,展示如何应用决策树算法进行比赛胜负预测。我们将详细讲解数据预处理、特征工程及模型评估等关键步骤。 ... [详细]
  • 目录一、salt-job管理#job存放数据目录#缓存时间设置#Others二、returns模块配置job数据入库#配置returns返回值信息#mysql安全设置#创建模块相关 ... [详细]
  • 本文介绍如何使用 Python 将一个字符串按照指定的行和元素分隔符进行两次拆分,最终将字符串转换为矩阵形式。通过两种不同的方法实现这一功能:一种是使用循环与 split() 方法,另一种是利用列表推导式。 ... [详细]
  • Python 异步编程:深入理解 asyncio 库(上)
    本文介绍了 Python 3.4 版本引入的标准库 asyncio,该库为异步 IO 提供了强大的支持。我们将探讨为什么需要 asyncio,以及它如何简化并发编程的复杂性,并详细介绍其核心概念和使用方法。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 本题涉及一棵由N个节点组成的树(共有N-1条边),初始时所有节点均为白色。题目要求处理两种操作:一是改变某个节点的颜色(从白变黑或从黑变白);二是查询从根节点到指定节点路径上的第一个黑色节点,若无则输出-1。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • Codeforces Round #566 (Div. 2) A~F个人题解
    Dashboard-CodeforcesRound#566(Div.2)-CodeforcesA.FillingShapes题意:给你一个的表格,你 ... [详细]
  • 深入了解 Windows 窗体中的 SplitContainer 控件
    SplitContainer 控件是 Windows 窗体中的一种复合控件,由两个可调整大小的面板和一个可移动的拆分条组成。本文将详细介绍其功能、属性以及如何通过编程方式创建复杂的用户界面。 ... [详细]
  • 不确定性|放入_华为机试题 HJ9提取不重复的整数
    不确定性|放入_华为机试题 HJ9提取不重复的整数 ... [详细]
  • 本题探讨了在大数据结构背景下,如何通过整体二分和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社区 版权所有