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

news2024/9/22 17:38:17

一、题目描述

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

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

给你一个二叉树的根节点 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 函数用于在递归过程中选择最大的路径和。这是处理最大路径和问题时的一种常见技巧,因为路径和可能是由多个部分组成的,我们需要选择最大的那一个。

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

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

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

相关文章

swift微调牧歌数据电商多模态大语言模型

大规模中文多模态评测基准MUGE_数据集-阿里云天池多模态理解和生成评估挑战榜(MUGE)是由阿里巴巴达摩院智能计算实验室发起,由阿里云天池平台承办,并由浙江大学、清华大学等单位共同协办。 Mhttps://tianchi.aliyun.com/dataset/107332微调的是牧歌数据集,结果都不好,记录…

C语言学习系列:笔记列表

1&#xff0c;精神建设&#xff1a;为什么要学C语言以及如何学习C语言 2&#xff0c;C语言学习系列&#xff1a;GCC编译器Windows版本MinGW-w64的安装教程 3&#xff0c;C语言学习系列&#xff1a;初识C语言 4&#xff0c;C语言入门学习系列&#xff1a;基本语法

工业和信息化部电子工业标准化研究院人工智能从业人员“计算机视觉设计开发工程师”专项培训(第四期)

注&#xff1a;若出现无法显示完全的情况&#xff0c;可搜索“人工智能技术与咨询”查看完整文章 声明: 公众号转载的文章及图片出于非商业性的教育和科研目的供大家参考和探讨&#xff0c;并不意味着支持其观点或证实其内容的真实性。版权归原作者所有&#xff0c;如转载稿涉及…

面试-NLP八股文

机器学习 交叉熵损失&#xff1a; L − ( y l o g ( y ^ ) ( 1 − y ) l o g ( 1 − ( y ^ ) ) L-(ylog(\hat{y}) (1-y)log(1-(\hat{y})) L−(ylog(y^​)(1−y)log(1−(y^​))均方误差&#xff1a; L 1 n ∑ i 1 n ( y i − y ^ i ) 2 L \frac{1}{n}\sum\limits_{i1}^{n}…

软件3班20240612

加粗样式 maven 根据的使用案例 package com.yanyu;public class Demo02 {// 设置 一个 求 两个数 的 和 的 方法 sumpublic void sum(int num1, int mum2) {System.out.println("两个数 的 和 是 &#xff1a;" (num1 mum2));} }import com…

盲盒小程序推广与运营策略的挑战

随着盲盒经济的兴起&#xff0c;越来越多的商家开始关注并尝试开发盲盒小程序。然而&#xff0c;在推广和运营盲盒小程序的过程中&#xff0c;我们也不可避免地会遇到一些挑战。下面&#xff0c;我将就用户获取、留存以及活跃度提升等方面&#xff0c;探讨这些挑战及可能的应对…

常用环境部署(十四)——Docker部署MinIO

一、安装Docker及Docker-compose https://blog.csdn.net/wd520521/article/details/112609796 二、Docker-compose部署MinIO 1、在服务器创建/data/minio目录 mkdir -p /data/minio 2、 docker-compose.yml脚本创建 vim /data/minio/docker-compose.yml &#xff08;1&a…

使用易备数据备份软件,简单快速地备份 Oracle 数据库

易备数据备份软件能够以简单高效的方式&#xff0c;实现对 Oracle 数据库的保护。 易备数据备份软件数据库备份功能的关键特性 自动保护网站数据库及应用程序实时备份&#xff0c;不需要任何中断或数据库锁定基于日期和时间的备份任务计划可恢复到一个已存在的数据库或创建一…

【java计算机毕设】图书商城管理系统MySQL springboot vue html maven送文档

1项目功能介绍 【java计算机毕设】图书商城管理系统 Java Spring Boot vue HTML MySQL 赠送文档 PPT 2项目简介 系统功能&#xff1a; 图书商城管理系统包括管理员和用户两种角色。 管理员的功能包括在个人中心修改个人信息&#xff0c;以及在基础数据管理中管理会员等级类型和…

STM89C51开发学习1

环境安装&#xff1a; 使用Keil uVision4环境进行对51单片机的学习。 在进行使用之前先用keygen进行对软件的破解防止后续发生不必要的问题。 开发环境下载完毕后&#xff0c;检查电脑是否有串口驱动&#xff08;可以在网上下载&#xff09; CH340驱动。 安装stcai-…

小程序视图渲染数据和部分事件的绑定

今天依旧使用这个目录进行教学 数据的渲染 在 index.js的 page中定义一个data对象结构是这样的 Page({data:{name:张三} }) 在index.wxml 中 利用模板语法进行渲染 <view >{{name}}</view> 注意这个模板里边不能使用js的方法 要循环渲染数组&#xff0c;如 在…

目标检测中的anchor机制

目录 一、目标检测中的anchor机制 1.什么是anchor boxes&#xff1f; 二、什么是Anchor&#xff1f; ​编辑三、为什么需要anchor boxes&#xff1f; 四、anchor boxes是怎么生成的&#xff1f; 五、高宽比&#xff08;aspect ratio&#xff09;的确定 六、尺度(scale)的…

数字影像产业园:打造数字经济高地,赋能未来产业

成都国际数字影像产业园凭借其得天独厚的区位优势、完善的配套设施、先进的产业定位和便捷的交通条件&#xff0c;逐步成为成都市乃至全国数字影像、文创、媒体产业的重要聚集地。 成都国际数字影像产业园位于成都市金牛区的核心地带&#xff0c;其主导产业为数字影像、文创、媒…

LCD电子广告牌课程设计

概述 1.1课程设计简介 亮丽实用的广告牌可以给我们的生活添加光彩、可以给店铺招揽生意。传统的广告牌都是固定的汉字&#xff0c;并且时间长了会掉色&#xff0c;使汉字模糊难认&#xff0c;这就给我的生活带来很多的不便。尤其到了晚上传统广告牌就会失去其该有的作用。所以在…

四季变换,制氮机使用注意事项

随着四季的轮回变换&#xff0c;大自然展现着不同的风貌。对于制氮机而言&#xff0c;季节的变换同样会带来不同的使用挑战和注意事项。本文将为您揭示四季变换对制氮机使用的影响&#xff0c;帮助您更好地掌握制氮机的季节使用须知。 春季 温湿度变化&#xff1a;春季温湿度逐…

VitePress做一个自己的知识博客

创建项目 // 1.创建项目,直接在空项目下安装vitepress(npm/yarn等都可以,这个可以看官网,官网给了好几种安装方式) yarn add -D vitepress // 2.初始化配置项目(npm/官网也给了多种包管理工具的安装方式) yarn vitepress init // 初始化命令执行完会遇到以下几个问题 ┌ Welc…

C语言之数组

目录 一、数组的概念 二、一维数组的使用 数组的创建 数组的初始化 数组的使用 三、一维数组在内存中的存储 四、sizeof计算数组元素个数 五、二维数组的使用 数组的创建 数组的初始化 数组的使用 六、二维数组在内存中的存储 七、C99中的变长数组 八、总结 一、…

linux系统安装anaconda,并通过java程序调用python程序

虚拟环境准备 首先准备一块空的分区&#xff0c;安装anaconda至少要20g以上才能执行简单程序&#xff0c;这里准备20G的磁盘空间 创建分区,执行以下步骤&#xff0c;之后执行reboot重启 fdisk /dev/sda p n 回车 回车 w查看当前系统创建的分区&#xff0c;我这里是名为sda3的…

Docker:认识Docker Bridge网络

文章目录 为什么需要网络管理Docker网络架构简介CNMLibNetwork驱动Docker网络管理命令网络命令基本操作网络详解docker Bridge网络 容器之间的网络通信DNS解析 为什么需要网络管理 容器的网络默认会与宿主机器以及其他的容器相互隔离&#xff0c;但是还需要考虑到下面的这些问…

2024年大数据、区块链与物联网国际会议(ICBDBLT 2024)

2024 International Conference on Big Data, Blockchain, and Internet of Things 【1】大会信息 会议简称&#xff1a;ICBDBLT 2024 大会地点&#xff1a;中国青岛 审稿通知&#xff1a;投稿后2-3日内通知 会议官网&#xff1a;www.icbdblt.com 【2】会议简介 即将召开的…