Leetcode 二叉树中的最大路径和

在这里插入图片描述

算法思想

这道题要求在一棵二叉树中找到路径和最大的路径。路径可以从树中任意一个节点开始,到任意一个节点结束,但路径上的节点必须是连续的。

算法使用递归的方式来遍历树中的每个节点,并在遍历过程中计算包含当前节点的最大路径和。具体步骤如下:

  1. 递归辅助函数 (calculatePathSum)

    • 这个函数用于计算以当前节点为起点的最大路径和。
    • 它通过递归分别计算左右子树的最大路径和,然后加上当前节点的值来得到当前路径的和。
  2. 路径和的计算

    • leftMaxrightMax 分别表示左子树和右子树的最大路径和,但如果子树路径和为负数,则忽略该子树路径,即设为 0,因为负数会降低总路径和。
    • currentMaxPathSum 代表了经过当前节点的路径和,包含左子树路径、当前节点值、右子树路径之和。
  3. 全局最大路径和的更新

    • 每当计算出一个 currentMaxPathSum,就将其与当前的全局最大路径和 maxSum 比较,以确保 maxSum 始终保存最大值。
    • 这样就能保证即使最优路径不经过根节点,也能记录全局最大路径和。
  4. 返回值

    • 函数返回当前节点值加上左右子树中较大的那个路径和,这样在递归向上返回时,可以确保每个节点返回的路径是包含它自身和一边子树的最大路径和。

复杂度分析

  • 时间复杂度:(O(n)),其中 (n) 是树中的节点数,因为每个节点只访问一次。
  • 空间复杂度:(O(h)),其中 (h) 是树的高度,这是递归调用栈的最大深度。

代码的运行流程示例

假设输入的树结构如下:

    1/ \2   3
  • 从根节点 1 开始,递归计算其左右子树的最大路径和。
  • 对于节点 2 和节点 3,它们的左右子树均为 null,因此它们的左右路径和为 0
  • 计算出节点 2 的最大路径和为 2,节点 3 的最大路径和为 3
  • 根节点 1 的路径和为 1 + 2 + 3 = 6
  • 最终结果是 6
class Solution {private int maxSum = Integer.MIN_VALUE;public int maxPathSum(TreeNode root) {calculateSum(root);return maxSum;}private int calculateSum(TreeNode root) {if(root == null) return 0;int leftMax = Math.max(calculateSum(root.left), 0);int rightMax = Math.max(calculateSum(root.right), 0);int currentmaxSum = root.val + leftMax + rightMax;maxSum = Math.max(currentmaxSum, maxSum);return root.val + Math.max(leftMax, rightMax);}
}

为什么 calculateSum 返回的不是node.val + leftMax + rightMax;?

这行代码的设计是因为我们要分清两种不同的情况:

  1. 更新全局最大路径和

    • 我们在每个节点处计算经过该节点的完整路径和,这条路径是包含了左子树、当前节点和右子树的路径和,即 node.val + leftMax + rightMax。这就是我们在 maxSum = Math.max(maxSum, currentMaxPathSum); 这一步中更新的内容。
    • 这个路径和会用于更新全局最大路径和 maxSum,因为这可能是当前遇到的最大路径。
  2. 返回值的意义

    • 在递归中,返回值代表以当前节点为起点向上递归时的“可选最大路径和”。
    • 注意,递归返回时不能同时选择左右子树的路径,因为递归往上走只能选择一条单一路径,而不是一条完整的左-当前-右的路径。
    • 因此,返回 node.val + Math.max(leftMax, rightMax);,表示从当前节点向上递归时,所能带回的最大路径和只能选择左子树或右子树中的较大者,来形成一条单向的路径。

总结

如果直接返回 node.val + leftMax + rightMax,那么递归上层的节点就会以包含当前节点左右子树路径的方式继续扩展路径,造成逻辑上的错误,因为每条路径必须是从上往下的一条单路径。

所以:

  • 全局最大路径和:用 node.val + leftMax + rightMax 来更新,因为这条路径可以是左-当前-右的完整路径。
  • 递归返回值:用 node.val + Math.max(leftMax, rightMax),因为只能选择左右子树中的一个路径继续往上递归。

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

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

相关文章

Python 变量在函数中的作用域

什么是局部变量? 作用范围在函数内部,在函数外部无法使用 什么是全局变量? 在函数内部和外部均可使用 如何将函数内定义的变量声明为全局变量? 使用global关键字, global变量 练习: 演示局部变量 #…

【Android】Kotlin教程(4)

文章目录 1.field2.计算属性3.主构造函数4.次构造函数5.默认参数6.初始化块7.初始化顺序7.延迟初始化lateinit8.惰性初始化 1.field field 关键字通常与属性的自定义 getter 和 setter 一起使用。当你需要为一个属性提供自定义的行为时,可以使用 field 来访问或设置…

SSH登录介绍

说明:一般登录服务器,我们可以用远程连接工具,如XShell、Windterm等,或者通过公司搭建的JumpServer(跳板机、堡垒机)来连接。前者是点对点登录,输入主机、端口,通过SSH协议登录&…

unity中预制体的移动-旋转-放缩

unity中预制体的移动-旋转-放缩 左上侧竖栏图标介绍Tools(手形工具)Move Tool(移动工具,单位米)Rotate Tool(旋转工具,单位角度)Scale Tool(缩放工具,单位倍数)Rect Tool(矩形工具)Transform Tool(变换工具)图标快捷键对照表工具使用的小技巧…

HarmonyOS开发 - 本地持久化之实现LocalStorage实例

用户首选项为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。数据存储形式为键值对,键的类型为字符串型,值的存储数据类型包括数字型、字符型、布尔型以及这3种类型的数组类型。 说明&#x…

java程序打包为一个exe程序

ok,最近学到了一个有意思的东西 那就是如何将自己写好的java程序打包成一个exe程序,发给别人,然后运行。 那么开始之前,请先安装整个工具: exe4j:https://www.ej-technologies.com/exe4j/download&#…

高并发设计模式之ForkJoin模式

分而治之是一种思想,所谓分而治之就是把一个复杂的算法问题按一定的分解方法分为规模较小的若干部分,然后逐个解决,分别找出各部分的解,最后把各部分的解在整合成整个问题的解.ForkJoin模式就是分而治之思想的另一种应用. ForkJoin模式的原理 ForkJoin模式先把一个大任务分解…

AMD XILINX 20nm器件价格上调25%

随着市场回暖,台积电也在调整价格策略,近期台积电上调了20nm的出厂价格。 据相关消息显示,AMD为了保障持续的供货和服务,也计划将20nm器件的价格统一上调25%,预计将于11月发布正式的涨价通知,并于2025年Q1开…

EfficientNet-B6模型实现ISIC皮肤镜图像数据集分类

项目源码获取方式见文章末尾! 回复暗号:13,免费获取600多个深度学习项目资料,快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于opencv答题卡识别判卷】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【G…

为何我们要将测试左移?回到过去的美好时光

以下为作者观点: 为何我们将测试左移?在传统的开发周期中,测试通常在功能完成后甚至在开发阶段结束时进行。左移测试通过从开发过程开始到整个开发过程整合测试活动来挑战这一点。 让我们首先讨论一下为什么我们选择“左移”,因…

java项目之基于智能推荐的卫生健康系统(springboot)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的基于智能推荐的卫生健康系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 基于智能推荐…

性能测试详解

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 一、 性能测试术语解释 1. 响应时间 响应时间即从应用系统发出请求开始,到客户端接收到最后一个字节数据为止所消耗的时间。响应时间按软件的特点…

深度学习基础—循环神经网络(RNN)

引言 从本系列博客开始,我们将来一起学习一下NLP领域的相关基础知识,NLP领域重要的模型是RNN,在此之前,先来了解一些符号的含义。 1.符号定义 (1)符号定义 假设建立一个能够自动识别句中人名位置的序列模型…

【工具变量】自由贸易试验区试点DID数据集(2003-2023年)

数据简介:自由贸易试验区(Free Trade Zone,简称FTZ)是中国ZF在新形势下为了推进GG开放、提高开放型经济水平而采取的重要战略举措。自贸试验区在一国的部分领土内运入任何货物,被认为在关境以外,免于实施惯…

Flask

创建项目 Pycharm专业版 默认文件 Pycharm社区版没有自动创建这几个文件,手动创建即可。 运行 常规功能 debug模式 修改内容自动更新,否则需要重新启动运行项目才生效。 修改host 通网络内其他人可以通过我得ip访问该服务。 修改端口号 空格分隔…

[Wireshark] 使用Wireshark抓包https数据包并显示为明文、配置SSLKEYLOGFILE变量(附下载链接)

前言 wireshark安装包 链接:https://pan.quark.cn/s/febb28f57c01 提取码:fUCQ 链接失效(可能会被官方和谐)可评论或私信我重发 chrome与firefox在访问https网站的时候会将密钥写入这个环境变量SSLKEYLOGFILE中,在wir…

野火鲁班猫4 (RK3588)系统配置

烧写系统 参考文档 : https://doc.embedfire.com/linux/rk3588/quick_start/zh/latest/quick_start/apt/apt.html 先装第一个软件,然后打开第二个软件。点固件,选择Ubuntu最新的固件,这边目前是20240911这个。 我这边直接烧写到…

Servlet 3.0 新特性全解

文章目录 Servlet3.0新特性全解Servlet 3.0 新增特性Servlet3.0的注解Servlet3.0的Web模块支持servlet3.0提供的异步处理提供异步原因实现异步原理配置servlet类成为异步的servlet类具体实现异步监听器改进的ServletAPI(上传文件) Servlet3.0新特性全解 tomcat 7以上的版本都支…

[OceanBase-不止于记录]:揭秘双引擎战略,共探AI时代数据架构未来

前言 又到了一年一度大家最爱的探会文章,非常荣幸收到OceanBase官方的邀请参加2024 OceanBase 年度发布会,作为一个经常参加线下探会的博主,每一次体验都有所不同,每一次新技术的突破都让人感到无比兴奋。同时,作为数…

【论文复现】短期电力负荷

作者主页: 七七的个人主页 文章收录专栏: 论文复现 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖 短期电力负荷 论文发表问题背景一. 基本问题二. 本论文发现的问题 对于论文发现问题的解决方案:复现…