LeetCode题练习与总结:二叉树中的最大路径和--124

一、题目描述

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

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

给你一个二叉树的根节点 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 * 10^4]
  • -1000 <= Node.val <= 1000

二、解题思路

  1. 使用递归的方式,后序遍历二叉树,对于每个节点,计算其左子树和右子树的最大路径和。
  2. 对于每个节点,其最大路径和可以是其左子树的最大路径和、右子树的最大路径和、或者节点值本身,取这三者的最大值。
  3. 同时,需要记录一个全局变量,用于保存遍历过程中的最大路径和。

三、具体代码

class Solution {
    private int maxSum = Integer.MIN_VALUE;

    public int maxPathSum(TreeNode root) {
        maxGain(root);
        return maxSum;
    }

    private int maxGain(TreeNode node) {
        if (node == null) {
            return 0;
        }

        // 计算左子树的最大路径和
        int leftGain = Math.max(maxGain(node.left), 0);
        // 计算右子树的最大路径和
        int rightGain = Math.max(maxGain(node.right), 0);

        // 计算当前节点的最大路径和,并更新全局最大路径和
        int priceNewPath = node.val + leftGain + rightGain;
        maxSum = Math.max(maxSum, priceNewPath);

        // 返回当前节点的最大路径和
        return node.val + Math.max(leftGain, rightGain);
    }
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 对于二叉树中的每个节点,我们都会调用一次 maxGain 函数。
  • 在 maxGain 函数中,我们对每个节点的左右子节点各调用一次 maxGain 函数。
  • 因此,每个节点只会被访问一次,所以时间复杂度是 O(N),其中 N 是二叉树中节点的数量。
2. 空间复杂度
  • 空间复杂度主要取决于递归栈的深度,这通常由树的高度决定。
  • 在最坏的情况下,树完全不平衡,每个节点都只有一个子节点,递归栈的深度将是 O(N)。
  • 在最好的情况下,树是完全平衡的,递归栈的深度将是 O(logN)。
  • 因此,空间复杂度在最坏情况下是 O(N),在最好情况下是 O(logN)。

综上所述,该算法的时间复杂度是 O(N),空间复杂度在最坏情况下是 O(N),在最好情况下是 O(logN)。

五、总结知识点

  1. 递归:这是一种常用的算法设计技巧,用于解决分而治之的问题。在这个问题中,我们使用递归函数 maxGain 来计算每个节点的最大路径和。

  2. 后序遍历:递归函数 maxGain 以后序遍历的方式访问二叉树的每个节点,即先访问左子树,然后是右子树,最后是当前节点。

  3. 二叉树的结构:代码中使用了 TreeNode 类来表示二叉树的节点,每个节点包含一个整数值 val 和两个指向其左右子节点的指针 left 和 right

  4. 路径和的计算:在递归函数中,我们计算每个节点的左子树和右子树的最大路径和,然后将它们与当前节点的值相加,得到经过当前节点的最大路径和。

  5. 全局变量的使用maxSum 是一个全局变量,用于在递归过程中记录遍历到的最大路径和。

  6. 边界条件的处理:当递归函数遇到空节点时,返回0,这表示如果子树的最大路径和为负,则可以忽略该子树。

  7. 数学函数的应用Math.max 函数用于在递归过程中选择最大的路径和。这是处理最大路径和问题时的一种常见技巧,因为路径和可能是由多个部分组成的,我们需要选择最大的那一个。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

简单了解java中线程的使用

线程 1、线程的相关概念 1.1、并行和并发 并行&#xff1a;在同一时刻&#xff0c;有多个任务在多个CPU上同时执行 并发&#xff1a;在同一时刻&#xff0c;有多个任务在单个CPU上交替执行 1.2、进程和线程 进程&#xff1a;就是在多任务管理系统中&#xff0c;每个独立执…

1502 - JUC高并发

慢慢挣&#xff0c;今天比昨天更有钱&#xff0c;明天比今天有钱&#xff0c;后天比明天有钱。 0.思维导图 6.多线程锁 synchronized实现同步的基础&#xff1a;Java中的每一个对象都可以作为锁。 具体表现为以下3中形式 对于普通同步方法&#xff0c;锁是当前实例对象。对于…

go语音进阶 多任务

多任务 什么叫 多任务&#xff1f;简单说&#xff1a;就像是操作系统可以同时执行 多个任务。打个比方 你一边使用 浏览器上网&#xff0c;一遍在听MP3, 一边再用 word 赶作业。对于电脑来讲这就是多任务&#xff0c;还有很多任务悄悄的在后台同时运行着&#xff0c;只是桌面上…

【Ardiuno】实验使用ESP32单片机连接Wifi(图文)

ESP32单片机最为精华和有特色的地方当然是wifi连接&#xff0c;这里我们就写程序实验一下适使用ESP32主板连接wifi&#xff0c;为了简化实验我们这里只做了连接部分&#xff0c;其他实验在后续再继续。 由于本实验只要在串口监视器中查看结果状态即可&#xff0c;因此电路板上…

macOS 15 beta (24A5264n) Boot ISO 原版可引导镜像下载

macOS 15 beta (24A5264n) Boot ISO 原版可引导镜像下载 iPhone 镜像、Safari 浏览器重大更新、备受瞩目的游戏和 Apple Intelligence 等众多全新功能令 Mac 使用体验再升级 请访问原文链接&#xff1a;https://sysin.org/blog/macOS-Sequoia-boot-iso/&#xff0c;查看最新版…

如何有效释放Docker占用的存储空间

随着Docker的广泛应用&#xff0c;我们经常会遇到Docker占用过多存储空间的问题。这可能是由于频繁的镜像拉取、容器创建和删除等操作导致的。本文将介绍几种方法来有效释放Docker占用的存储空间&#xff0c;特别是docker system prune命令的使用。 Docker的存储机制 Docker使…

springboot连接多个库

一个SpringBoot项目&#xff0c;同时连接两个数据库&#xff1a;比如一个是Mysql数据库&#xff0c;一个是oracle数据库&#xff08;啥数据库都一样&#xff0c;连接两个同为oracle的数据库&#xff0c;或两个不同的数据库&#xff0c;只需要更改对应的driver-class-name和jdbc…

【C++】list 容器的增删改查---模拟实现(图例超详细解析!!!)

目录 一、前言 二、 list 容器的模拟实现思 ✨ 模块分析 ✨ 作用分析 三、list的节点类设计 四、list 的迭代器类设计 ⭐ 迭代器类--存在的意义 ⭐ 迭代器类--模拟实现 &#x1f4a6; 模板参数 和 成员变量 &#x1f4a6; 构造函数 &#x1f4a6; 运算符的重载 &…

HyperBDR新版本上线,自动化容灾兼容再升级!

本次HyperBDR v5.5.0版本新增完成HCS&#xff08;Huawei Cloud Stack&#xff09;8.3.x和HCSO&#xff08;Huawei Cloud Stack Online&#xff09;自动化对接&#xff0c;另外还突破性完成了Oracle云(块存储模式)的自动化对接。 HyperBDR&#xff0c;云原生业务级别容灾工具。支…

PS教程系统17

橡皮擦工具 主要配合画笔工具来使用 选择画笔工具新建图层试验擦除线条 如果直接在背景图片上进行擦除 会有背景颜色补充 背景橡皮擦 将其白色背景擦除掉shift相关键&#xff0c;进行工作区域切换吸取样点一次采样、两次采样连续、不连续等功能 在进行涂擦的过程一…

Unity EasyRoads3D插件使用

一、插件介绍 描述 Unity 中的道路基础设施和参数化建模 在 Unity 中使用内置的可自定义动态交叉预制件和基于您自己导入的模型的自定义交叉预制件&#xff0c;直接创建独特的道路网络。 添加额外辅助对象&#xff0c;让你的场景栩栩如生&#xff1a;桥梁、安全护栏、栅栏、墙壁…

RawChatGPT:公益大模型使用网站

文章目录 一、Rawchat介绍二、使用教程三、案例应用3.1 图片内容分析3.2 生图演示3.3 文档解析 一、Rawchat介绍 RawChat为用户提供了更为便捷的使用方式。 二、使用教程 RawChat公益站点链接&#xff1a;https://ChatGPTplus.cn 进入后&#xff0c;我们只需要点击&#xf…

基于Java+Swing+mysql幼儿园信息管理系统V2

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Php和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…

深入理解rtmp(三)之手把手实现握手协议

RTMP是基于TCP协议的应用层协议,默认通信端口1935.实现握手协议前先了解一下rtmp握手协议吧!!! 握手过程 要建立一个有效的RTMP Connection链接&#xff0c;首先要“握手”:客户端要向服务器发送C0,C1,C2&#xff08;按序&#xff09;三个chunk&#xff0c;服务器向客户端发送…

Linux1(介绍与基本命令)

目录 一、初始Linux 1. Linux的起源 2. Linux是什么&#xff1f; 3. Linux内核版本 4. Linux的应用 5. 终端 6. Shell 7. Linux目录结构 二、基本命令 1. 基本的命令格式 2. shutdown 关机命令 3. pwd 当前工作目录 4. ls 查看目录内容 5. cd 改变工作目录 …

揭秘速卖通API接口:打破电商边界,用代码驱动全球业务增长

速卖通&#xff08;AliExpress&#xff09;通常指的是阿里巴巴集团旗下的国际零售电商平台。然而&#xff0c;直接通过API接口与速卖通进行交互通常涉及阿里巴巴的开放平台&#xff08;Open Platform&#xff09;和相关API。由于API的具体细节、认证方式、请求参数和返回值可能…

六种图算法的python实现

六种图算法的python实现 1. Prim 算法 基本原理 Prim算法是一种求解最小生成树的贪心算法。所谓最小生成树&#xff0c;就是对于给定的连通图&#xff0c;找到一棵包含所有顶点的树&#xff0c;且树上所有边的权重之和最小。Prim算法从一个顶点开始&#xff0c;每次选择与当…

数据丢失?揭秘easyrecovery破解版下载安装步骤教程,一键恢复!

“我不小心把硬盘里的重要文件删了&#xff0c;怎么都找不到了&#xff01;” “电脑突然崩溃了&#xff0c;所有的数据都没了&#xff0c;怎么办&#xff1f;” 这些情况是不是让你感到绝望&#xff1f;不过别担心&#xff0c;EasyRecovery数据恢复软件可以帮你轻松解决这些问…

[office] excel表格中双击鼠标左键有什么快捷作用- #经验分享#媒体

excel表格中双击鼠标左键有什么快捷作用? excel表格中双击鼠标左键有什么快捷作用&#xff1f;不要小看鼠标左键双击的作用&#xff0c;在excel中双击鼠标左键可以实现六个功能&#xff0c;提高工作效率&#xff0c;到底是那六个功能呢&#xff1f;请看下文详细介绍 在表格中…

R语言绘图 --- 桑基图(Biorplot 开发日志 --- 5)

「写在前面」 在科研数据分析中我们会重复地绘制一些图形&#xff0c;如果代码管理不当经常就会忘记之前绘图的代码。于是我计划开发一个 R 包&#xff08;Biorplot&#xff09;&#xff0c;用来管理自己 R 语言绘图的代码。本系列文章用于记录 Biorplot 包开发日志。 相关链接…