力扣题/二叉树/二叉树中的最大路径和

news2024/12/28 23:51:23

二叉树中的最大路径和

力扣原题

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

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

给你一个二叉树的根节点 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

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number}
 */
var maxPathSum = function(root) {
    let max = -Number.MAX_VALUE // 递归过程更新最大值

    function dfs(node) {
        if(!node) return 0
        const val = node.val

        const leftMax = dfs(node.left)
        const rightMax = dfs(node.right)
        
        // 1. 当前节点最大贡献值 = 当前节点值 + 左子树最大贡献值 + 右子树最大贡献值
        const sum = val + Math.max(leftMax, 0) + Math.max(rightMax, 0) 

        max = Math.max(max, sum) // 更新最大值
        
        if(!node.left && !node.right) {
            // 2.1. 叶子节点:非负数时作为最大贡献值返回,否则最大贡献值为0
            return Math.max(val, 0)
        } else {
            // 2.2 非叶子节点:  当前节点值 + 取其中的最大值(左子树最大贡献值,右子树最大贡献值)
            const childMax = Math.max(leftMax, rightMax)
            return Math.max(val + childMax, 0) // 大于0才选为最大贡献值递归,否则不选相当于0
        }

    }
    dfs(root)
    return max
};

解题思路

核心思路,把所有节点,都当作只有当前根节点+左子树+右子树
获取节点最大贡献值,和递归的最大贡献值,逻辑不一样。
获取当前节点最大贡献值,相当于以当前节点作为根节点了,最大贡献值就是当前节点加左子树和右子树的最大贡献值
而当往回递归时,当前节点不作为根节点,而是子树,此时递归返回的最大贡献值,只能选择其一,否则就存在分叉了

  1. 要获取当前节点的,最大路径和(以下称为最大贡献值),显而易见得到:
    当前节点最大贡献值 = 当前节点值 + 左子树最大贡献值(非负) + 右子树最大贡献值(非负)

  2. 但是如何保证不出现分叉,那就需要在递归的时候进行限制了,递归条件:
    2.1 叶子节点:非负数时作为最大贡献值返回,否则最大贡献值为0
    2.2 非叶子节点: 当前节点值 + 取其中的最大值(左子树最大贡献值,右子树最大贡献值)

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

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

相关文章

景联文科技:图像标注的类型有哪些?

图像标注是计算机视觉领域中一个非常重要的步骤,它是创建训练数据集的关键组成部分,主要用于帮助机器学习算法理解图像内容。 以下是图像标注的一些主要类型: 1. 边界框标注: • 这是最常见的标注方式之一,通常用于…

Python深度学习框架库之caffe使用详解

概要 Caffe 是一个由伯克利视觉与学习中心(BVLC)开发的深度学习框架,以其速度快、模块化设计和社区支持而闻名。Caffe 适用于视觉识别任务,广泛应用于学术研究和产业实践中。Caffe 提供了一个强大的 Python 接口,使开发者能够方便地使用 Python 进行深度学习模型的开发和…

QT 简易音乐播放器

目录 放置控件 获取mp3文件 播放音乐 准备工作 加载模块 加载头文件 new一个output对象,Mediaplayer对象 把outpout对象交给mediaplayer对象 给播放器设置音乐 播放 优化 上一曲下一曲功能 双击歌曲播放 获取音乐时长和音乐播放时间 让音乐进度条跟随音乐走 调…

解决element-ui回车键绑定按钮功能后却刷新浏览器的问题

最近写代码时,遇到要给回车键绑定确定的功能,并且打开对话框时要自动获取输入框焦点,发现一但重新打开浏览器,第一次执行回车键的功能时就会刷新浏览器,后续则会成功执行。但是一但再一次重新打开浏览器,还…

【简历】北京某985大学:JAVA秋招简历指导,面试通过率较高

注:为保证用户信息安全,姓名和学校等信息已经进行同层次变更,内容部分细节也进行了部分隐藏 简历说明 我们今天要看一位来自25届985同学的JAVA简历。 既然要参加校招的话,我们校招法典的第一准则:定你的学校层次。 …

win11中vsstudio2019使用winusb开usb应用

根据微软官方文档,在安装使用winusb之前,需求wdk环境。 下载 Windows 驱动程序工具包 (WDK) - Windows drivers | Microsoft Learn WDK环境安装 访问安装官网Previous WDK versions and other downloads - Windows drivers | Microsoft Learn 点开vs…

鸿蒙「TaskPool|Worker」多线程并发使用详解,这一篇足够!

概念介绍 鸿蒙的多线程并发TaskPool和Worker,他们具有相同内存模型,线程间隔离内存不共享。在项目中若使用到,有几个较重要的条件或特点这里简单作出列举。 CPU密集型任务,说白了是计算型耗时任务; I/O密集型任务&…

C# 静态方法和实例方法

一、静态成员,实例成员,静态方法,实例方法 静态成员就是用static修饰的字段; 实例成员就是没有被static修饰的字段; 静态方法就是用static修饰的方法; 实例方法就是没有被static修饰的方法;…

OriginPro快速上手指南:数据可视化与分析的利器

目录 OriginLab - Origin and OriginPro - Data Analysis and Graphing Softwarehttps://www.originlab.com/​编辑 一、安装与界面概览 安装 界面概览 二、基础操作 数据输入 创建图表 三、高级功能 数据分析 自动化与脚本 Origin 提供了几个小工具 四、技巧与提示…

AI编程-vscode安装“通义灵码”

“通义灵码”是一款基于阿里云通义代码大模型打造的智能编码助手 1、vscode中,选择插件,输入“tongyi” ,弹出插件选项 2、点击install 安装 3、弹出登录提示 4、选择log in,弹出阿里云登录界面 登录成功后提示 5、返回vscode…

【吸引力法则】人生欲:追求深度体验与宇宙链接

文章目录 探究人生欲:追求深度体验与宇宙链接唤醒人生欲:克服配得感的三大障碍法执的压制家庭的继承 探究人生欲:追求深度体验与宇宙链接 在人生的广阔舞台上,我们时常探寻着那些能够引领我们走向更深层次成长与体验的力量。今天&…

C语言—函数递归

一、递归概念 递归其实是⼀种解决问题的⽅法,在C语⾔中,递归就是函数⾃⼰调⽤⾃⼰。下面举一个例子: 上述就是⼀个简单的递归程序,只不过上⾯的递归只是为了演⽰递归的基本形式,不是为了解决问题,代码最终…

ddos造成服务器瘫痪后怎么办

在服务器遭受DDoS攻击后,应立即采取相应措施,包括加强服务器安全、使用CDN和DDoS防御服务来减轻攻击的影响。rak小编为您整理发布ddos造成服务器瘫痪后怎么办。 当DDoS攻击发生时,首先要做的是清理恶意流量。可以通过云服务提供商提供的防护措…

java解析facebook的android app直投下的Referral URL

背景: 在facebook的应用推广中,一般使用两种方式,一种是app直投,一种是w2a。 app直投就是用户点击广告直接跳转到应用商店进行下载应用 w2a就是通过落地页方式引导用户进行应用下载 在w2a模式下,可以通过落地页链接…

Repeat方法:取模运算教材与Unity控制台输出数值不同的原因

学习该知识点的参考教材:Unity API解析/陈宏泉编著.——北京:人民邮电出版社,2014.9 编辑脚本的环境:Visual Studio 2022 在学习该本教材的第五章Mathf类的内容,通过跟随教材上的代码了解不同UnityAPI的具体用法时&a…

【数据结构】七、查找:1.查找的概念、线性结构查找(顺序、折半(二分)、插值、稠密、分块、倒排)

一、查找Search 文章目录 一、查找Search1.查找的基本概念1.1基本概念1.2算法评价标准 二、线性结构1.顺序表查找❗1.1顺序查找1.1.1算法思想1.1.2顺序查找效率分析 2.有序表查找❗2.1折半查找2.1.1算法思想2.1.2判定树构造2.1.3通过判定树进行查找效率分析2.1.4被查找概率不相…

ReactNative笔记(自用)

环境 ios更换gem镜像源: 查看当前源: gem sources -l 移除默认源: gem sources --remove https://rubygems.org/。添加新的源: 添加 Ruby China 的镜像源: gem source -a https://gems.ruby-china.com/或者添加其他镜像源。 清华大学的gem源: htt…

进阶-1.存储引擎

存储引擎 存储引擎1.MySQL体系结构2.存储引擎简介3.存储引擎特点3.1 InnoDB3.2 MyISAM3.3 Memory 4. 存储引擎选择 存储引擎 1.MySQL体系结构 2.存储引擎简介 存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现。存储引擎是基于表的,而不是基于库的&…

【数学分析笔记】第2章第1节实数系的连续性(1)

2. 数列极限 2.1 实数系的连续性 人类对数系认识的历史: 人类最早对数系的认识是自然数集合 N \mathbb{N} N,自然数系对加法和乘法是封闭的(这里的封闭是指:若 m ∈ N , n ∈ N ⇒ m n ∈ N , m n ∈ N m\in\mathbb{N},n\in\ma…

芯片用什么胶粘接牢固?​​​​​​​

芯片用什么胶粘接牢固?芯片粘接胶的牢固性对于电子产品的性能和可靠性至关重要。选择合适的胶水可以确保芯片能够稳定、可靠地固定在基板上。芯片的粘接通常涉及几种不同类型的胶水,每种胶水都有其特定的应用场景和性能特点。以下是几种常见的用于芯片粘接的胶水类…