【二叉树】Leetcode 124. 二叉树中的最大路径和【困难】

二叉树中的最大路径和

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

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

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

示例1:
在这里插入图片描述
输入:root = [1,2,3]
输出:6
解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6

解题思路

这个问题可以使用递归解决,对于每个节点:

  • 1、以该节点为根的路径和(该路径和包括该节点,可能往左、往右、或者左右都有)。
  • 2、以该节点的左子树为起点的最大路径和。
  • 3、以该节点的右子树为起点的最大路径和。
  • 4、取这三者的最大值作为以当前节点为根的最大路径和。

Java实现

public class MaxPathSum {static class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int val) {this.val = val;}}private int maxSum = Integer.MIN_VALUE;public int maxPathSum(TreeNode root) {maxPathSumHelper(root);return maxSum;}private int maxPathSumHelper(TreeNode node) {if (node == null) {return 0;}
//        10
//       /  \
//      2    10
//     / \     \
//    20  1     -25
//              / \
//             3   4// 计算以当前节点为根的路径和,可能包括左右子树int leftSum = Math.max(0, maxPathSumHelper(node.left));int rightSum = Math.max(0, maxPathSumHelper(node.right));// 更新全局最大路径和maxSum = Math.max(maxSum, leftSum + rightSum + node.val);// 返回以当前节点为根的路径和的最大值,注意不要包括左右子树return Math.max(leftSum, rightSum) + node.val;}// 示例测试public static void main(String[] args) {MaxPathSum solution = new MaxPathSum();// 构造二叉树TreeNode root = new TreeNode(10);root.left = new TreeNode(2);root.right = new TreeNode(10);root.left.left = new TreeNode(20);root.left.right = new TreeNode(1);root.right.right = new TreeNode(-25);root.right.right.left = new TreeNode(3);root.right.right.right = new TreeNode(4);int result = solution.maxPathSum(root);System.out.println(result); // 输出 42}
}

时间空间复杂度

  • 时间复杂度:O(N),其中 N 是二叉树中节点的数量,因为我们需要遍历每个节点。

  • 空间复杂度:O(H),其中 H 是二叉树的高度,因为递归调用栈的深度取决于二叉树的高度。

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

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

相关文章

前端学习<三>CSS进阶——04-如何让一个元素水平垂直居中?

前言 老板的手机收到一个红包,为什么红包没居中? 如何让一个子元素在父容器里水平垂直居中?不管是学生还是找工作这个问题点必考,在实战开发中,也应用得非常多。 你也许能顺手写出好几种实现方法。但大部分人的写法…

shell 批量创建用户

代码 rootlocalhost:~ 2024-04-03 15:45:03# cat create_user.sh ######################################################################### # File Name: create_user.sh # Author: eight # Mail: 18847097110163.com # Created Time: Wed 03 Apr 2024 03:…

golang语言系列:学习路线图

云原生学习路线导航页(持续更新中) 本文是 golang语言系列 文章,主要展示golang语言学习的全路线图 参考:https://github.com/darius-khll/golang-developer-roadmap/blob/master/i18n/zh-CN/ReadMe-zh-CN.md

【星城战记】揭秘成本控制奥秘 如何超越个人开店!

在电玩城行业的竞争中,成本控制和运营管理是决定企业盈利能力和生存空间的关键因素。许多投资者在选择投资项目时,往往忽视了这两个方面的重要性,导致在运营过程中遭遇重重困难。而【星城战记】作为行业内的佼佼者,以其卓越的成本…

科学的分析和解决ROS运行中产生的undefined symbol类报错的方法

在我们运行ROS开源功能包的时候,可能会遇到: undefined symbol类报错,如 slam_gmapping: undefined symbol: _ZN8GMapping 14 sampleGaussianEdm 一、报错原因分析 该问题一般是缺失或者没有找到该功能包所需的某个.so 动态链接库文件。首先,…

在 Windows 中安装部署并启动连接 MongoDB 7.x(命令行方式启动、配置文件方式启动、将启动命令安装为系统服务实现开机自启)

MongoDB 的下载 下载地址:https://www.mongodb.com/try/download/community 这里需要对 MongoDB 的版本号说明一下: MongoDB 版本号的命名规则是 x.y.z,当其中的 y 是奇数时表示当前的版本为开发版,当其中的 y 是偶数时表示当前的…

函数参数缺省和内联函数【C++】

文章目录 函数参数缺省函数参数缺省的条件和要求 内联函数内联函数的工作原理内联函数的定义方法内联函数的要求解决方法:直接在.h中定义内联函数的函数体 内联函数再Debug模式下默认是不展开的 函数参数缺省 顾名思义:可以少传一个/多个参数给函数&…

科东软件参加广州机器人产业联盟举办先进工业母机专家研讨会

工业母机是“制造机器的机器”,具有基础性、通用性、战略性特征,包括了减材切削机床、等材成形装备、增材制造装备及其控制系统等,是衡量国家工业水平和竞争力的重要标志。广东省作为全球知名的制造业基地,非常重视高端装备领域工…

2024年第三期丨全国高校大数据与人工智能师资研修班邀请函

2024年第三期 杭州线下班 数据采集与机器学习实战(Python) 线上班 八大专题 大模型技术与应用实战 数据采集与处理实战(Python&八爪鱼) 大数据分析与机器学习实战(Python) 商务数据分析实战&…

AI数据质量监控:数据质量的关键KPI都有哪些?

AI所支持的程序或设备成功实施的关键取决于用于训练模型的数据。使用低质量训练数据会导致模型训练不良,从而可能需要额外时间和预算进行重新训练和测试。为防止这种情况,最佳方法是在模型训练过程中实施质量检查。需要注意的是,不同质量度量…

LVS几种模式介绍

备注:这篇真的是水文,不看也罢。 LVS,linux virtual server,可提供IP网络层的负载均衡。 其主要模式主要有以下几种: LVS-NAT 主要通过网络地址转换,修改目的IP实现。Network Address Translation LVS-…

JS封装网页进入/退出全屏功能,兼容各大主流浏览器

1、演示 2、封装进入全屏函数 mozRequestFullScreen:兼容Firefox webkitRequestFullscreen:兼容 Chrome、Safari、Opera msRequestFullscreen:兼容:IE/Edge const enter () > {const element document.documentElementif (el…