leetcode热题100.二叉树中的最大路径和

Problem: 124. 二叉树中的最大路径和

文章目录

  • 题目
  • 解题方法
  • 复杂度
  • Code

题目

二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。

路径和 是路径中各节点值的总和。

给你一个二叉树的根节点 root ,返回其 最大路径和 。

示例 1:
在这里插入图片描述

输入:root = [1,2,3]
输出:6
解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6
示例 2:

输入:root = [-10,9,20,null,null,15,7]
输出:42
解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42

提示:

树中节点数目范围是 [1, 3 ∗ 1 0 4 3 * 10^4 3104]
-1000 <= Node.val <= 1000

解题方法

题目要求我们计算二叉树中的最大路径和,我们可以这样思考:

对于以node节点为中心,其最长路径和就是它向左和向右的最长的路径和再加上它本身的值的和,我们要计算每一个节点的这样的和,然后记录最大值,这个最大值就是我们的答案

我们先编写一下下面这样的函数,

        def dfs(node):if not node:return 0left = max(0,dfs(node.left))right = max(0,dfs(node.right))return node.val + max(left,right)
  • 在递归出口中,我们设置如果node不存在,就返回0,
  • 对于叶子节点,他的左右节点都是0,所以就返回其本身的值
  • 对于非叶子节点,因为题目要求我们返回更大的路径和,所以返回当前节点与左右子节点的最大值的和
  • 在处理左子节点和右子节点的时候,我们可以采取不选这条路径的策略,所以他们的最小值就是0,这里我们用max(1,val)实现这一逻辑

此时我们获得了一个node节点为根节点的左边和右边的最大路径和

为了计算题目中要求的最大路径和,我们可以对于每一个节点都进行上述的计算,最终返回最大值,这种做法也是可以的
但是,有一种更为优秀的策略,那就是在递归过程中,return之前计算,此时我们已经拿到左右节点的最大值了,我们加上这个节点自己的值,就是以这个节点为根节点,左右路径最大和,我们保存最大和的最大值,就是最终答案

复杂度

时间复杂度:

O ( n ) O(n) O(n)

空间复杂度:

O ( n ) O(n) O(n)

Code

# 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 = right
class Solution:def __init__(self):self.ans = -1000def maxPathSum(self, root: Optional[TreeNode]) -> int:def dfs(node):if not node:return 0left = max(0,dfs(node.left))right = max(0,dfs(node.right))val = left+right+node.valself.ans = max(self.ans,val)return node.val + max(left,right)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/663120.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pytorch_car_caring 排坑记录

pytorch_car_caring 排坑记录 任务踩坑回顾简单环境问题代码版本问题症状描述解决方法 cuda问题&#xff08;异步问题&#xff09;症状描述解决方法 任务 因为之前那个MPC代码跑出来的效果不理想&#xff0c;看了一天代码&#xff0c;大概看明白了&#xff0c;但要做改进还要有…

C语言指针学习 之 指针是什么

前言 指针是C语言中一个重要概念&#xff0c;也是C语言的一个重要特色&#xff0c;正确而灵活地运用指针可以使程序简洁、紧凑、高效。每一个学习和使用C语言的人都应当深入的学习和掌握指针&#xff0c;也可以说不掌握指针就没有掌握C语言的精华。 一、什么是指针 想弄清楚什…

末世智能毁灭机械

在一个遥远的星球上&#xff0c;AI和机器人在末世中扮演着重要角色。由于一场毁灭性的灾难&#xff0c;人类文明几乎被彻底毁灭&#xff0c;幸存者被迫在废土中艰难求生。为了重建家园&#xff0c;人类和机器人联手&#xff0c;利用智能机械技术开始了重建工作。 然而&#xff…

应用层协议 ——— HTTP协议

应用层协议 ——— HTTP协议 HTTP简介认识URL二、登录信息三、服务器地址四、服务器端口号五、带层次的文件路径六、查询字符串七、片段标识符urlencode和urldecodeHTTP协议格式HTTP请求协议格式HTTP的方法HTTP的状态码HTTP常见的HeaderHTTPS VS HTTP对称加密 VS 非对称加密 HT…

Stable diffusion使用和操作流程

Stable Diffusion是一个文本到图像的潜在扩散模型,由CompVis、Stability AI和LAION的研究人员和工程师创建。它使用来自LAION-5B数据库子集的512x512图像进行训练。使用这个模型,可以生成包括人脸在内的任何图像,因为有开源的预训练模型,所以我们也可以在自己的机器上运行它…

Java工具类库Hutool

这里写目录标题 一、简介二、包含组件三、常用功能演示2、时间工具DateUtil3、数字类工具NumberUtil4、身份认证工具IdcardUtil5、信息脱敏工具DesensitizedUtil6、字段校验工具Validator7、集合工具类CollStreamUtil 一、简介 Hutool是一个小而全的Java工具类库&#xff0c;通…

类与对象

面向对象的程序设计 面对对象的程序 类 类 .... 类 设计程序的过程&#xff0c;就是设计类的过程。 面对对象的程序设计方法&#xff1a; 1.将某类客观事物共同特点&#xff08;属性&#xff09;归纳出来&#xff0c;形成一个数据结构&#xff08;可以用多个变量描述…

定义HarmonyOS IDL接口

HarmonyOS IDL简介 HarmonyOS Interface Definition Language&#xff08;简称HarmonyOS IDL&#xff09;是HarmonyOS的接口描述语言。HarmonyOS IDL与其他接口语言类似&#xff0c;通过HarmonyOS IDL定义客户端与服务端均认可的编程接口&#xff0c;可以实现在二者间的跨进程…

SpringBoot+Vue实现各种文件预览(附源码)

&#x1f468;‍&#x1f4bb;作者简介&#xff1a;在笑大学牲 &#x1f39f;️个人主页&#xff1a;无所谓^_^ ps&#xff1a;点赞是免费的&#xff0c;却可以让写博客的作者开心好几天&#x1f60e; 项目运行效果 前言 在做项目时&#xff0c;文件的上传和预览必不可少。继上…

数字化转型:企业适应新常态的关键之举_光点科技

在全球商业环境不断演变和技术日新月异的背景下&#xff0c;数字化转型已经成为企业不可回避的课题。它不仅关乎企业的未来生存与发展&#xff0c;更是适应新常态、提升竞争力的关键之举。但是&#xff0c;数字化转型并非一夜之间可以完成的任务&#xff0c;它需要全面的策略规…

nosql数据库期末考试知识点总结

目录 1、什么是nosql数据库&#xff0c;它包括哪些 文档数据库 建数据 哪一种是最简单的 2、什么是文档数据库 3、创建mongodb时默认会建造三个数据库&#xff0c;是哪三个 4、mongodb支持的数据类型有哪些 5、它的常规语句有哪些 6、副本集和分片集有什么作用 复制 …

linux中vim的操作

(码字不易&#xff0c;关注一下吧w~~w) 命令模式&#xff1a; 当我们按下esc键时&#xff0c;我们会进入命令模式&#xff1b;当使用vi打开一个文件时也是进入命令模式。 光标移动&#xff1a; 1 保存退出&#xff1a;ZZ 2 代码格式化&#xff1a;ggG 3 光标移动&#xff…

JSP和JSTL板块:第一节 JSP追根溯源 来自【汤米尼克的JAVAEE全套教程专栏】

板块一 JSP和JSTL&#xff1a;第一节 JSP主要内容 一、什么是JSP二、IDEA的JSP相关配置1.UTF-8编码2.JSP代码模板 三、JSP的底层是Servlet四、Jsp的注释1.显式注释2.隐式注释 五、Scriptlet : 写在Jsp里的java脚本段 一、什么是JSP JSP: Java Server Page。SUN 公司提供的动态…

查询、导入导出、统计性能优化的一些总结

目录 1、背景 2、优化实现 2.1查询数据表速度慢 2.2调别人接口速度慢 2.3导入速度慢、 2.4导出速度慢的做出介绍 2.5统计功能速度慢 3、总结 1、背景 系统上线后&#xff0c;被用户反应系统很多功能响应时长很慢。用户页面影响速度有要求&#xff0c;下面针对查询数据表…

【Leetcode】2670. 找出不同元素数目差数组

文章目录 题目思路代码结果 题目 题目链接 给你一个下标从 0 开始的数组 nums &#xff0c;数组长度为 n 。 nums 的 不同元素数目差 数组可以用一个长度为 n 的数组 diff 表示&#xff0c;其中 diff[i] 等于前缀 nums[0, …, i] 中不同元素的数目 减去 后缀 nums[i 1, …, …

双非本科准备秋招(14.1)—— 力扣刷题

今天做两个有点难度的题。 1、295. 数据流的中位数 手写堆实现&#xff1a; 加入元素&#xff1a; 如何维护一个中位数&#xff1f;我们考虑一下堆的特点&#xff0c;大顶堆堆顶是一个最大值&#xff0c;小顶堆堆顶是一个最小值&#xff0c;那么&#xff0c;如果我们可以把数…

GitHub的使用操作

记得看目录哦&#xff01; 1. 创建仓库2. 下载desktop3. 把创建的库克隆到本地4. 文件拷贝到本地仓库![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/7171ac6c4ca14e3b8d22717121f79c9e.png)5. 在网址后面加/compare进行比较6. 给系统添加功能 1. 创建仓库 2. 下载…

数据结构之动态查找表

数据结构之动态查找表 1、二叉排序树1.1、二排序树的定义1.2、二叉排序树的查找过程1.3、在二叉排序树中插入结点的操作1.4、在二叉排序树中删除结点的操作 2、平衡二叉树2.1、平衡二叉树上的插入操作2.2、平衡二叉树上的删除操作 3、B_树 数据结构是程序设计的重要基础&#x…

C++——数据类型

C——数据类型 1.基本变量类型 C 基本数据类型整理成表格。以下是一个表格&#xff0c;展示了不同的基本数据类型及其一般用途和大小范围&#xff1a;和C语言类似。 2.宽字符的用法 #include <iostream> #include <locale> #include <wchar.h> int main…