leetcode hot100【LeetCode 124.二叉树中的最大路径和】java实现

LeetCode 124.二叉树中的最大路径和

题目描述

给定一个非空二叉树,返回其最大路径和。路径定义为从树中任意节点出发,到达任意节点的有向边序列。该路径至少包含一个节点,且不需要在根节点开始或结束。

示例 1:

输入: tree = [1,2,3]1/ \2   3
输出: 6

解释: 最大路径和为 2 + 1 + 3 = 6。

示例 2:

输入: tree = [-10,9,20,null,null,15,7]-10/  \9   20/  \15   7
输出: 42

解释: 最大路径和 = 15 + 20 + 2 = 42。

Java 实现代码

class Solution {private int maxSum = Integer.MIN_VALUE;public int maxPathSum(TreeNode root) {calculateMaxPathSum(root);return maxSum;}private int calculateMaxPathSum(TreeNode node) {if (node == null) {return 0;}// 计算左子树的最大单侧路径和,负值取0int leftMax = Math.max(0, calculateMaxPathSum(node.left));// 计算右子树的最大单侧路径和,负值取0int rightMax = Math.max(0, calculateMaxPathSum(node.right));// 计算经过当前节点的路径和int currentPathSum = node.val + leftMax + rightMax;// 更新全局最大路径和maxSum = Math.max(maxSum, currentPathSum);// 返回当前节点的单侧最大路径和return node.val + Math.max(leftMax, rightMax);}
}

解题思路

  1. 递归后序遍历:

    • 对于每个节点,我们需要计算:
      • 通过该节点的路径贡献值(即该节点与其左右子树的最大单侧路径和)。
      • 经过该节点的最大路径和(即左子树最大路径和 + 当前节点值 + 右子树最大路径和)。
  2. 全局最大值更新:

    • 用一个全局变量记录二叉树中的最大路径和,每次递归过程中动态更新。
  3. 返回值:

    • 对于每个节点,递归函数返回以该节点为起点的最大单侧路径和。

复杂度分析

  • 时间复杂度O(n) 每个节点只访问一次,因此时间复杂度为 O(n),其中 n 是节点总数。

  • 空间复杂度O(h) 递归调用栈的空间复杂度为 O(h),其中 h 是二叉树的高度。在最坏情况下,h = O(n)(完全不平衡树)。

示例 树结构

     1/    \3       5/ \     /   \
6   7  8     2 

目标:求二叉树中的最大路径和

最大路径和的定义:

  • 路径:路径必须至少包含一个节点,路径可以从树中的任意节点出发,经过父子连接,最终到达任意节点。
  • 路径和:路径上所有节点的值的和。
  • 最大路径和:树中的所有路径中,路径和最大的那个值。
递归计算每个节点的贡献
  1. 节点 6

    • 6 没有左右子树,因此返回 6
    • 对于节点 6,它的最大路径和贡献就是它本身的值:
      leftMax = 0, rightMax = 0
      currentPathSum = 6
      return 6 (返回以 `6` 为起点的最大路径和)
      
  2. 节点 7

    • 7 没有左右子树,因此返回 7
    • 对于节点 7,它的最大路径和贡献也是它本身:
      leftMax = 0, rightMax = 0
      currentPathSum = 7
      return 7 (返回以 `7` 为起点的最大路径和)
      
  3. 节点 3

    • 计算节点 3 的最大路径和:
      • 左子树返回 6
      • 右子树返回 7
    • currentPathSum = 3 + 6 + 7 = 16,它是通过节点 3 经过 67 的最大路径和。
    • 但是 3 也可以选择只通过左子树或右子树,因此返回的最大路径和是:
      currentPathSum = 3 + 6 + 7 = 16
      return 3 + max(6, 7) = 3 + 7 = 10 (返回以 `3` 为起点的最大路径和)
      
    • 更新全局最大路径和 maxSum16
  4. 节点 8

    • 8 没有左右子树,因此返回 8
    • 对于节点 8,它的最大路径和贡献就是它本身:
      leftMax = 0, rightMax = 0
      currentPathSum = 8
      return 8 (返回以 `8` 为起点的最大路径和)
      
  5. 节点 2

    • 2 没有左右子树,因此返回 2
    • 对于节点 2,它的最大路径和贡献就是它本身:
      leftMax = 0, rightMax = 0
      currentPathSum = 2
      return 2 (返回以 `2` 为起点的最大路径和)
      
  6. 节点 5

    • 计算节点 5 的最大路径和:
      • 左子树返回 8
      • 右子树返回 2
    • currentPathSum = 5 + 8 + 2 = 15,它是通过节点 5 经过 82 的最大路径和。
    • 但是 5 也可以选择只通过左子树或右子树,因此返回的最大路径和是:
      currentPathSum = 5 + 8 + 2 = 15
      return 5 + max(8, 2) = 5 + 8 = 13 (返回以 `5` 为起点的最大路径和)
      
  7. 节点 1(根节点):

    • 计算节点 1 的最大路径和:
      • 左子树返回 10(从 3 节点传递过来的最大路径和)。
      • 右子树返回 13(从 5 节点传递过来的最大路径和)。
    • currentPathSum = 1 + 10 + 13 = 24,它是通过节点 1 经过左子树 10 和右子树 13 的最大路径和。
    • 但是 1 也可以选择只通过左子树或右子树,因此返回的最大路径和是:
      currentPathSum = 1 + 10 + 13 = 24
      return 1 + max(10, 13) = 1 + 13 = 14 (返回以 `1` 为起点的最大路径和)
      
    • 更新全局最大路径和 maxSum24
全局最大路径和: 通过上述递归计算,我们得到了整个树中的最大路径和 24,路径是: 6 -> 3 -> 1 -> 5 -> 8

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

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

相关文章

【IEEE出版 | 中国石油大学(华东)主办】第六届信息与计算机前沿术国际学术会议(ICFTIC 2024,12月13-15日)

第六届信息与计算机前沿术国际学术会议(ICFTIC 2024) 2024 6th International Conference on Frontier Technologies of Information and Computer 官方信息 会议官网:WWW.ICFTIC.ORG 2024 6th International Conference on Frontier Technologies of Information…

如何在SM30生成的维护表中增加选择框 CheckBox

用户想要在屏幕中显示选择框进行维护,如下图: 很简单,先通过 SE11 定义一个 CHAR1 类型的字段名,然后通过使用程序转到表维护生成器 进入到概述屏幕,双击,然后进入到屏幕布局: 先删除原来通过系…

极客争锋 智连未来 TuyaOpen Framework极客创意大赛正式开启

TuyaOpen Framework极客创意大赛正式开启 可选择基于: TuyaOpen Framework 原生开源包: https://github.com/tuya/tuyaopen 支持 Ubuntu/T2/T3/T5/ESP32/ESP32C3等多款芯片TuyaOpen Arduino:https://github.com/tuya/arduino-tuyaopen支持 T2/T3/T5等多款芯片TuyaOpen LuaNode…

麒麟kysec安全

一、kysec安全框架管理 开启kysec getstatus Copy security-switch --set default Copy 重启系统 reboot Copy 刷新页面,等待几分钟,即可完成文件的扫描。 查看kysec状态 getstatus Copy 切换到管理员身份(密码:devuser…

c++ 左值、右值、左值引用()、右值引用(),移动构造和std::move

左值和右值 不是等于号的左边和右边 !!(一部分场景下是这样) 右值可以描述成一个临时值 c 左值、右值、左值引用、右值引用&& 左值右值左值引用右值引用结论 第二弹~ 你可以完全不看上面的解释移动语义移动构造和move 左…

黑马嵌入式开发入门模电基础学习笔记

学习视频: 黑马程序员嵌入式开发入门模电(模拟电路)基础 文章目录 背景介绍电流电压组件仿真三极管ne555PCBEDA案例:非接触式电笔案例:电子琴 背景介绍 电流 电压 组件 仿真 三极管 mos管 ne555 PCB EDA 案例:非接触…

Tomcat启动过程中cmd窗口(控制台)中文乱码的问题

目录 一、问题产生 二、问题分析 三、解决方法(2种) 一、问题产生 在服务器上使用新的Tomcat9(绿色版ZIP),打开一个cmd窗口后,将路径定位到“tomcat\bin\”目录,运行“startup.bat”。程序会自动打开一个新窗口,这个是Java程序的运行窗口,但是里面的中文全是乱码,如…

Neo4j Desktop 和 Neo4j Community Edition 区别

Neo4j Desktop 和 Neo4j Community Edition 的主要区别在于它们的用途、功能以及安装和管理方式。以下是这两者的详细对比: 1. Neo4j Desktop Neo4j Desktop 是一个图形化的桌面应用程序,主要为开发人员和个人使用提供了一个便捷的环境来安装、管理和运…

FebHost:企业注册.UK域名步骤--了解英国商业环境

企业注册.UK域名步骤:了解英国商业环境 对于希望拓展国际业务的公司和企业家来说,在英国开展业务具有众多优势。英国是一个对企业友好的目的地,吸引着初创企业和国际公司,并将自己定位为首屈一指的全球经济强国,在欧洲…

无人机动力系统测试-实测数据与CFD模拟仿真数据关联对比分析

我们经常被问到这样的问题:“我们计划运行 CFD 仿真,我们还需要对电机和螺旋桨进行实验测试吗?我们可能有偏见,但我们的答案始终是肯定的,而且有充分的理由。我们自己执行了大量的 CFD 仿真,但我们承认&…

cantos7.9系统-部署mysql-8.0.35

前言:MySQL是一个流行的开源关系型数据库管理系统(RDBMS),它基于SQL(Structured Query Language)进行操作。以下是MySQL的一些基本介绍: 开源:MySQL由瑞典MySQL AB公司开发,后来被Su…

预测AI如何提升销售绩效管理:五大方式

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

# 第20章 Cortex-M4-触摸屏

第20章 Cortex-M4-触摸屏 20.1 触摸屏概述 20.1.1 常见的触摸屏分类 电阻式触摸屏、电容式触摸屏、红外式触摸屏、表面声波触摸屏 市场上用的最多的是电阻式触摸屏与电容式触摸屏。红外管式触摸屏多用于投影仪配套设备。 电阻式触摸屏构成:整个屏由均匀电阻构成…

Selenium自动化测试

片头 嗨~小伙伴们,今天,我们来开启新的篇章---Selenium自动化测试,准备好了吗?咱们开始咯! 一、自动化测试 指通过专门的软件工具和脚本来执行测试任务,而不需要人工干预。它可以自动执行各种测试任务&am…

下一代以区域为导向的电子/电气架构

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所有人的看法和评价都是暂时的,只有自己的经历是伴随一生的,几乎所有的担忧和畏惧…

RH850-F1KMS1 DMA数据转移

DMA简介 随着汽车电子系统和工业自动化的需求不断增长,DMA(Direct Memory Access,直接内存访问)技术在提高数据传输效率方面扮演着重要角色。在本篇文章中,我们将探讨RH850微控制器如何高效实现DMA传输,以…

MOSFET电路栅源极GS之间并联电容后,MOS炸管原因分析

1、前言 在介绍,在进行MOSFET相关的电路设计时,可能会遇到MOSFET误导通的问题,为了解决此问题,我们提出了两种方法,一种是增大MOSFET栅极串联电阻的阻值,另外一种是在MOSFET栅-源极之间并联一个电容&#…

Keil uvision的edition

0 Preface/Foreword 0.1 参考网址 https://zhuanlan.zhihu.com/p/456069876 1 Keil版本介绍 版本介绍: Keil Lite(免费版):最多32KB代码,无法使用中间件Keil Essential(基础版):没…

I/O文件:文件的关闭

int fclose(FILE *stream); 成功关闭返回1,关闭失败返回EOF即-1,并设置errno。 流关闭时自动刷新缓冲中的数据并释放缓冲区 当一个程序正常终止时,所有打开的流都会被关闭 流一旦关闭就不能执行任何操作。 运行结果: 若未成功打…

联邦学习的未来:深入剖析FedAvg算法与数据不均衡的解决之道

引言 随着数据隐私和数据安全法规的不断加强,传统的集中式机器学习方法受到越来越多的限制。为了在分布式数据场景中高效训练模型,同时保护用户数据隐私,联邦学习(Federated Learning, FL)应运而生。它允许多个参与方…