LeetCode算法递归类—二叉树中的最大路径和

目录

124. 二叉树中的最大路径和 - 力扣(LeetCode)

题解:

代码:

运行结果:


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

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

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

题解:

这道题目要求计算二叉树中路径和最大的路径和,即从任意节点出发、经过任意节点、到达任意节点的路径的和的最大值。

为了解决这个问题,我们可以使用递归的方式来遍历二叉树。对于每个节点,我们需要计算该节点的最大贡献值,即该节点作为路径的一部分时能够提供的最大和。

具体步骤如下:

  1. 创建一个变量 maxSum,用于存储结果,初始值设为负无穷大(Integer.MIN_VALUE)。
  2. 定义一个递归函数 gain(TreeNode root),计算节点的最大贡献值,并在递归过程中更新 maxSum 的值。
  3. 在递归函数中,首先进行终止条件的判断,如果当前节点为空,则直接返回 0。
  4. 分别递归计算左子节点和右子节点的最大贡献值,并将其与 0 取较大值。这是因为当贡献值为负数时,对于路径和的增益为 0。
  5. 计算当前节点的最大路径和,即节点值加上左右子节点的最大贡献值之和。
  6. 将当前节点的最大路径和与 maxSum 进行比较,取较大值更新 maxSum
  7. 返回当前节点的最大贡献值,即节点值加上左右子节点最大贡献值之间的较大值。
  8. 在 maxPathSum 函数中,调用 gain 函数计算根节点的最大贡献值,并返回 maxSum 的值作为结果。

这样,当递归结束时,maxSum 中存储的就是二叉树中路径和最大的路径和。

代码:

class Solution {// 存储结果int maxSum =Integer.MIN_VALUE;public int maxPathSum(TreeNode root) {gain(root);return maxSum;}// 计算节点最大贡献值public int gain(TreeNode root){// 终止条件if(root==null) return 0;// 递归计算左右子节点最大贡献值(结果为负数不计入)int left=Math.max(gain(root.left),0);int right=Math.max(gain(root.right),0);// 计算该结点的最大路径和// 节点最大路径和为该节点的值与该节点左右子节点的最大贡献值int max=root.val+left+right;//比较该节点的最大路径和与目前值(贪心算法)maxSum=Math.max(maxSum,max);// 返回该节点最大贡献值return root.val+Math.max(left,right);}
}

运行结果:

 

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

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

相关文章

Hive无法启动的解决方案

关掉虚拟机后&#xff0c;重新启动后&#xff0c;按照Hadoop和Hive的流程重新启动&#xff0c;发现无法启动成功&#xff0c;特别是元数据服务无法启动&#xff0c;出现以下错误: Exception in thread “main” java.lang.RuntimeException: java.net.ConnectException: Call F…

华为OD真题--分月饼--带答案

1. 华为OD机考题 答案 2023华为OD统一考试&#xff08;AB卷&#xff09;题库清单-带答案&#xff08;持续更新&#xff09; 2023年华为OD真题机考题库大全-带答案&#xff08;持续更新&#xff09; 2. 面试题 一手真实java面试题&#xff1a;2023年各大公司java面试真题汇总--…

基于Opencv的虚拟拖拽项目

预备知识 勾股定理 跟随移动算法 手势识别图解 项目源代码 """ 演示一个简单的虚拟拖拽 步骤&#xff1a; 1、opencv 读取视频流 2、在视频图像上画一个方块 3、通过mediapipe库获取手指关节坐标 4、判断手指是否在方块上 5、是&#xff0c;方块跟着移动 6、…

LeetCode1048 最长字符串链

思路 从短到长&#xff0c;增加字母的话&#xff0c;有多个位置&#xff0c;并且每个位置都有26种选择&#xff0c;正难则反。选择从长到短&#xff0c;删除某个字母。删除字母得到的新字符串可能已经计算过&#xff0c;所以将计算的结果都记录一下。记忆化搜索&#xff1a; 先…

密码学学习笔记(十九):密码学关键术语的解释1

数据加密标准(DES) 数据加密标准是使用最广泛的加密体制&#xff0c;它于1977年被美国国家标准和技术研究所(NIST)采纳为联邦信息处理标准FIPS PUB 46。 DES3DESAES明文分组长度&#xff08;位&#xff09;6464128密文分组长度&#xff08;位&#xff09;6464128密钥长度&…

开源Android apk转aab工具

功能 自动化将apk转为aab文件.自动化实现打包smali,签名,安装. 用法 配置文件(config.toml ) [sign] #"exec command: java -jar {} build-apks --bundle {} --output {} --ks {} --ks-pass pass:{} --ks-key-alias {} --key-pass pass:{}", config.jar.bundleto…

详解junit

目录 1.概述 2.断言 3.常用注解 3.1.Test 3.2.Before 3.3.After 3.4.BeforeClass 3.5.AfterClass 4.异常测试 5.超时测试 6.参数化测试 1.概述 什么是单元测试&#xff1a; 单元测试&#xff0c;是针对最小的功能单元编写测试代码&#xff0c;在JAVA中最小的功能单…

0101读写分离测试-jdbc-shardingsphere-中间件

文章目录 1 前言2、创建SpringBoot程序2.1、创建项目2.2、添加依赖2.3、生成实体类、service与Mapper1.5、配置读写分离 2、测试2.1、读写分离测试2.2、事务测试2.3、负载均衡测试 结语 1 前言 shardingshpere-jdbc定位为轻量级 Java 框架&#xff0c;在 Java 的 JDBC 层提供的…

【前端面试】中大文件上传/下载:中等文件代理服务器放行+大文件切片传输+并发请求+localstorage实现断点续传

目录 中等文件代理服务器放行&#xff1a;10MB为单位 proxy nginx 大文件切片&#xff1a;100MB为单位 断点&#xff1a;存储切片hash 前端方案A localstorage 后端方案B 服务端 上传 前端 后端 下载 前端 后端 多个大文件传输&#xff1a;spark-md5 哈希碰撞…

什么是Pytorch?

当谈及深度学习框架时&#xff0c;PyTorch 是当今备受欢迎的选择之一。作为一个开源的机器学习库&#xff0c;PyTorch 为研究人员和开发者们提供了一个强大的工具来构建、训练以及部署各种深度学习模型。你可能会问&#xff0c;PyTorch 是什么&#xff0c;它有什么特点&#xf…

JQuery快速入门教程

1、JQuery快速入门 1.1、JQuery介绍 jQuery 是一个 JavaScript 库。所谓的库&#xff0c;就是一个 JS 文件&#xff0c;里面封装了很多预定义的函数&#xff0c;比如获取元素&#xff0c;执行隐藏、移动等&#xff0c;目的就 是在使用时直接调用&#xff0c;不需要再重复定义…

微机原理与接口技术 学习笔记(二) 存储器

文章目录 一&#xff0c;存储器1.1 概述1.1.1 半导体存储器的分类按制造工艺&#xff1a; 易失性或挥发性存储器 / 不易失性或不挥发性存储器按制造工艺&#xff1a; 1.1.2 半导体存储器的性能指标1.1.3 半导体存储器的一般结构及组成 1.2 随机存取存储器 RAM1.2.1 静态RAM1.2.…

【数据结构】_8.二叉树OJ

目录 1. 题目1&#xff1a;检查两棵树是否相同 2. 题目2&#xff1a;判断一棵树是否为另一棵树的子树 3. 题目3&#xff1a;翻转二叉树 4. 题目4&#xff1a;判断一棵树是否为平衡二叉树 5. 题目5&#xff1a;判断一棵树是否为对称二叉树 6. 题目6&#xff1a;二叉树的层序…

第二周晨考自测(2.0)

1.冒泡排序 冒泡排序是数组解构中的常见排序算法之一。规则如下&#xff1a;先遍历数组&#xff0c;让相邻的两个数据进行比较&#xff0c;如果前一个比后一个大&#xff0c;那么就把这两个数据交换位置&#xff0c;经过一轮遍历之后&#xff0c;最大的那个数字就排在数组最后…

UML图绘制 -- 类图

1.类图的画法 类 整体是个矩形&#xff0c;第一层类名&#xff0c;第二层属性&#xff0c;第三层方法。 &#xff1a;public- : private# : protected空格: 默认的default 对应的类写法。 public class Student {public String name;public Integer age;protected I…

机器学习知识点总结:什么是GBDT(梯度提升树)

什么是GBDT(梯度提升树) 虽然GBDT同样由许多决策树组成&#xff0c;但它与随机森林由许多不同。 其中之一是GBDT中的树都是回归树&#xff0c;树有分类有回归&#xff0c;区分它们的方法很简单。将苹果单纯分为好与坏的是分类树&#xff0c;如果能为苹果的好坏程度打个分&…

pycharm上传项目到github,版本管理

前提&#xff1a;下载git 设置Git路径 登录Github 此时自动打开浏览器&#xff0c;并打开连接页面&#xff0c;点击 Authorize GitHub。登录&#xff1a; 创建本地仓库 提交到Github 填写初始提交相关信息 origin&#xff0c;它们只是远程服务器的一个别名&#xff0c;否则你就…

小程序前台Boot后台校园卡资金管理系统java web学校进销存食堂挂失jsp源代码

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 小程序前台Boot后台校园卡资金管理系统 系统有2权限&…

React Native expo项目修改应用程序名称

https://expo.dev/accounts/xutongbao/projects npm install --global eas-cli && \eas init --id e32cf2c0-da5b-4a65-814a-4958d58f0ca7 eas init --id e32cf2c0-da5b-4a65-814a-4958d58f0ca7 app.config.js: export default {name: 学习,slug: learn-gpt,owner: x…

虹科方案 | 汽车总线协议转换解决方案

虹科提供的汽车总线协议转换解决方案&#xff0c;有效地解决了车载ECU、总线测试工具等&#xff0c;因通信协议不兼容而无法通信的问题&#xff0c;并在优化测试台架、模拟总线信号等方向有显著的成效。 文章目录 前言一、应用场景1&#xff1a;跨协议通信测试BMS&#xff08;电…