leetcode--二叉树中的最大路径和

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

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

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

示例 1:
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/bbb8777d4de24c8e9c32da9cb9e1f00f.png

输入: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

实现思路

在二叉树中,路径被定义为一条节点序列,其中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中至多出现一次。路径至少包含一个节点,且不一定经过根节点。路径和是路径中各节点值的总和。给定一个二叉树的根节点,要求返回其最大路径和。

要找到最大路径和,我们需要考虑路径可以从任意节点开始和结束,并且路径可以不经过根节点。这意味着我们需要检查每个节点可能作为路径起点和终点的情况。

定义递归函数
我们定义一个递归函数 max_gain(node) 来计算节点的最大贡献值。这个函数计算从当前节点出发,延伸到左右子树所能获得的最大路径和。
计算当前节点的最大贡献值
如果当前节点为空,返回0。
计算左子树的最大贡献值,记为 left_gain。如果 left_gain 是负值,设置为0,因为负值不会增加路径和。
计算右子树的最大贡献值,记为 right_gain。如果 right_gain 是负值,设置为0,因为负值不会增加路径和。
计算路径和
计算当前节点作为路径最高点的路径和,即 node.val + left_gain + right_gain。
更新全局最大路径和。
返回节点的最大贡献值
返回节点的最大贡献值,即 node.val + max(left_gain, right_gain),因为路径只能选择一个子树继续延伸。

代码实现

# 定义二叉树节点类
class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = right# 最大路径和函数
def maxPathSum(root):def max_gain(node):nonlocal max_sumif not node:return 0# 递归计算左子树和右子树的最大贡献值left_gain = max(max_gain(node.left), 0)right_gain = max(max_gain(node.right), 0)# 当前节点的路径和current_path_sum = node.val + left_gain + right_gain# 更新最大路径和max_sum = max(max_sum, current_path_sum)# 返回节点的最大贡献值return node.val + max(left_gain, right_gain)max_sum = float('-inf')max_gain(root)return max_sum# 测试示例
if __name__ == "__main__":# 创建测试二叉树#        -10#       /  \#      9   20#         /  \#        15   7root = TreeNode(-10)root.left = TreeNode(9)root.right = TreeNode(20)root.right.left = TreeNode(15)root.right.right = TreeNode(7)result = maxPathSum(root)print("最大路径和:", result)  # 应该输出42

go实现

package mainimport ("fmt""math"
)// TreeNode 定义二叉树节点
type TreeNode struct {Val   intLeft  *TreeNodeRight *TreeNode
}// maxPathSum 计算二叉树的最大路径和
func maxPathSum(root *TreeNode) int {maxSum := math.MinInt64var maxGain func(node *TreeNode) intmaxGain = func(node *TreeNode) int {if node == nil {return 0}// 递归计算左子树和右子树的最大贡献值leftGain := max(maxGain(node.Left), 0)rightGain := max(maxGain(node.Right), 0)// 当前节点的路径和currentPathSum := node.Val + leftGain + rightGain// 更新最大路径和if currentPathSum > maxSum {maxSum = currentPathSum}// 返回节点的最大贡献值return node.Val + max(leftGain, rightGain)}maxGain(root)return maxSum
}// 辅助函数,取两个整数中的最大值
func max(a, b int) int {if a > b {return a}return b
}// 测试示例
func main() {// 创建测试二叉树//        -10//       /  \//      9   20//         /  \//        15   7root := &TreeNode{Val: -10}root.Left = &TreeNode{Val: 9}root.Right = &TreeNode{Val: 20}root.Right.Left = &TreeNode{Val: 15}root.Right.Right = &TreeNode{Val: 7}result := maxPathSum(root)fmt.Printf("最大路径和: %d\n", result) // 应该输出42
}

kotlin实现

// 定义二叉树节点类
class TreeNode(var `val`: Int) {var left: TreeNode? = nullvar right: TreeNode? = null
}// 最大路径和函数
fun maxPathSum(root: TreeNode?): Int {var maxSum = Int.MIN_VALUEfun maxGain(node: TreeNode?): Int {if (node == null) return 0// 递归计算左子树和右子树的最大贡献值val leftGain = maxOf(maxGain(node.left), 0)val rightGain = maxOf(maxGain(node.right), 0)// 当前节点的路径和val currentPathSum = node.`val` + leftGain + rightGain// 更新最大路径和maxSum = maxOf(maxSum, currentPathSum)// 返回节点的最大贡献值return node.`val` + maxOf(leftGain, rightGain)}maxGain(root)return maxSum
}// 测试示例
fun main() {// 创建测试二叉树//        -10//       /  \//      9   20//         /  \//        15   7val root = TreeNode(-10).apply {left = TreeNode(9)right = TreeNode(20).apply {left = TreeNode(15)right = TreeNode(7)}}val result = maxPathSum(root)println("最大路径和: $result")  // 应该输出42
}

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

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

相关文章

Nginx+Tomcat群集

**Nginx Tomcat 集群** Nginx 和 Tomcat 集群的组合是一种常见且强大的架构方案&#xff0c;旨在实现高可用性、可扩展性和高性能的 Web 应用服务。 Nginx 是一款轻量级的高性能 Web 服务器和反向代理服务器。它能够高效地处理静态资源请求&#xff0c;并将动态请求转发到后…

pytest-yaml-sanmu(六):YAML数据驱动测试

如果说 pytest 中哪些标记使用得最多&#xff0c;那无疑是 parametrize 了&#xff0c; 它为用例实现了参数化测试的能力&#xff0c;进而实现了数据驱动测试的能力。 1. 使用标记 parametrize 的使用需要提高两个内容&#xff1a; 参数名 参数值 pytest 在执行用例时&…

6元/年英国Giffgaff卡申请和使用

官网&#xff1a;https://www.giffgaff.com/freesim-international 今天和大家分享一款来自英国的电话卡——Giffgaff&#xff0c;它能够在大陆正常使用&#xff0c;并且保号的费用也十分便宜&#xff0c;大约6元/年。自己免费申请的卡已经激活成功&#xff0c;将过程与大家分…

亚信安全新一代终端安全TrustOne2024年重磅升级

以极简新主义为核心&#xff0c;亚信安全新一代终端安全TrustOne自2023年发布以来&#xff0c;带动了数字化终端安全的革新。60%&#xff0c;安装部署及管理效率的提升&#xff1b;50%&#xff0c;安全管理资源的节省&#xff1b;100%&#xff0c;信创非信创场景的全覆盖。Trus…

FastReport 指定sql 和修改 数据库连接地址的 工具类 :FastReportHelper

FastReport 指定sql 和修改 数据库连接地址的 工具类 &#xff1a;FastReportHelper 介绍核心代码&#xff1a;完整代码&#xff1a; 介绍 在FastReport中&#xff0c;经常会遇到需要给 sql 加条件的情况&#xff0c;或者给数据库地址做更换。 &#xff08;废话不多说&#x…

java之循环练习题

思路分析&#xff1a; 代码&#xff1a; public static void main(String[] args) {int sum0;for (int i1;i<100;i){for (int j1;j<i;j) {sum j;}}System.out.println(sum);} 结果为&#xff1a;

DeepViT:字节提出深层ViT的训练策略 | 2021 arxiv

作者发现深层ViT出现的注意力崩溃问题&#xff0c;提出了新颖的Re-attention机制来解决&#xff0c;计算量和内存开销都很少&#xff0c;在增加ViT深度时能够保持性能不断提高 来源&#xff1a;晓飞的算法工程笔记 公众号 论文: DeepViT: Towards Deeper Vision Transformer 论…

提升爬虫OCR识别率:解决嘈杂验证码问题

引言 在数据抓取和网络爬虫技术中&#xff0c;验证码是常见的防爬措施&#xff0c;特别是嘈杂文本验证码。处理嘈杂验证码是一个复杂的问题&#xff0c;因为这些验证码故意设计成难以自动识别。本文将介绍如何使用OCR技术提高爬虫识别嘈杂验证码的准确率&#xff0c;并结合实际…

面向对象的程序设计设计思想(解决问题所需要的类),面向过程的程序设计思想(解决问题的步骤)

一、引言 面向对象思想是现代编程语言的主流编程思想&#xff0c;除了C语言外&#xff0c;其他的主流编程语言&#xff0c;无论是脚本的还是非脚本的&#xff0c;基本上都引入了面向对象这一设计思想&#xff0c;面向对象设计思想是怎样的&#xff1f;为什么现在的编程语言大都…

模型驱动开发(Model-Driven Development,MDD):提高软件开发效率与一致性的利器

目录 前言1. 模型驱动开发的原理1.1 什么是模型驱动开发1.2 MDD的核心思想 2. 模型驱动开发的优势2.1 提高开发效率2.2 确保代码一致性2.3 促进沟通和协作2.4 方便维护和扩展 3. 实现模型驱动开发的方法3.1 选择合适的建模工具3.1.1 UML3.1.2 BPMN3.1.3 SysML 3.2 建模方法3.2.…

大学生竞赛管理系统-计算机毕业设计源码37276

大学生竞赛管理系统的设计与实现 摘 要 随着教育信息化的不断发展&#xff0c;大学生竞赛已成为高校教育的重要组成部分。传统的竞赛组织和管理方式存在着诸多问题&#xff0c;如信息不透明、效率低下、管理不便等。为了解决这些问题&#xff0c;提高竞赛组织和管理效率&#x…

K8S 上部署大数据相关组件

文章目录 一、前言二、Redis 一、前言 Artifact Hub 是一个专注于云原生应用的集中式搜索和发布平台。它旨在简化开发者在 CNCF&#xff08;Cloud Native Computing Foundation&#xff09;项目中寻找、安装和分享包与配置的过程。用户可以通过这个平台方便地发现、安装各类云原…

用SurfaceView实现落花动画效果

上篇文章 Android子线程真的不能刷新UI吗&#xff1f;(一&#xff09;复现异常 中可以看出子线程更新main线程创建的View&#xff0c;会抛出异常。SurfaceView不依赖main线程&#xff0c;可以直接使用自己的线程控制绘制逻辑。具体代码怎么实现了&#xff1f; 这篇文章用Surfa…

vscode启用项目后,没有触发debugger

启动项目后在debugger时&#xff0c;一直不走断点&#xff0c;重启vscode和电脑&#xff0c;打开其他vscode项目&#xff0c;都不行 1.F12点击设置 2.然后取消忽略列表的勾选即可。

【力扣高频题】042.接雨水问题

上一篇我们通过采用 双指针 的方法解决了 经典 容器盛水 问题 &#xff0c;本文我们接着来学习一道在面试中极大概率会被考到的经典题目&#xff1a;接雨水 问题 。 42. 接雨水 给定 n 个非负整数&#xff0c;表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子…

Java-Redis-Clickhouse-Jenkins-MybatisPlus-Zookeeper-vscode-Docker-jdbc

文章目录 Clickhouse基础实操windows docker desktop 下载clickhousespringboot项目配置clickhouse Redis谈下你对Redis的了解&#xff1f;Redis一般都有哪些使用的场景&#xff1f;Redis有哪些常见的功能&#xff1f;Redis支持的数据类型有哪些&#xff1f;Redis为什么这么快…

第一个ffmpeg程序

在进行使用ffmpeg进行编写程序时&#xff0c;首先要记得进行注册设备&#xff08;avdevice_register_all &#xff09;&#xff0c;程序运行时&#xff0c;只需要注册一次就可以 avdevice_register_all 是 FFmpeg 多媒体处理库中的一个函数&#xff0c;其作用是注册所有可用的音…

【AI前沿】人工智能的历史演进

文章目录 &#x1f4d1;引言一、人工智能的起源与早期发展1.1 古代与早期的智能机器设想1.2 20世纪初期的机械计算机1.3 图灵测试与计算智能1.4 达特茅斯会议与人工智能的正式诞生 二、早期AI研究与第一次冬天2.1 早期的探索与挑战2.2 早期的专家系统2.3 第一次AI冬天 三、专家…

SpringBoot日常:@Scheduled实现服务启动时执行一次

文章目录 一、Scheduled详解二、逻辑实现1、创建定时任务逻辑方法2、新建一个启动执行类 三、测试结果 说到定时任务&#xff0c;我们应该会想起Scheduled&#xff0c;Quartz以及XXL-JOB&#xff0c;但是有的单体服务或者小项目&#xff0c;为了方便快捷&#xff0c;可能会直接…

【昇思25天学习打卡营第1天】

前言 例如&#xff1a;随着大模型的爆火&#xff0c;这门技术也越来越重要&#xff0c;很多人都开启了关于大模型知识的学习&#xff0c;但大模型需要一定的资源且涉及的模块很多&#xff0c;如果个人想要系统的学习会有些难度&#xff0c;好在有昇思大模型平台&#xff0c;能…