LeetCode 刷题系列 -- 124. 二叉树中的最大路径和

news2025/1/16 18:55:48

路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。

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

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

124. 二叉树中的最大路径和 - 力扣(Leetcode)

思路

用递归方法,本题属于后续遍历,即先递归处理左右两个孩子节点,再处理当前节点
定义 函数 maxSum(TreeNode root) ,该函数意义为返回以该节点作为路径中一员,其能提供的最大贡献为 maxSum
处理当前节点的逻辑:
1. 以当前节点为根节点所能获取的最大路径和。若是左右子节点能提供的最大贡献大于 0 ,则可以将左右子节点加入到路径中
2. 返回当前节点能提供的最大路径和,结果为 root.val + max(leftSum, rightSum)

c++:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int result = 0;
    int maxPathSum(TreeNode* root) {
        if(root == nullptr) {
            return 0;
        }
        // 获取二叉树中值最小的节点,并以此为基础,进行比较
        dfs(root);
        
        maxSum(root);

        return result;
    }
    
    // 该函数意义为返回 当前节点 root 所能返回的最大贡献值
    int maxSum(TreeNode* root) {
        if(root == nullptr) {
            return 0;
        }
        int leftSum = maxSum(root->left);
        int rightSum = maxSum(root->right);
                
        leftSum = max(leftSum, 0);
        rightSum = max(rightSum, 0);

       // 以当前节点为根节点的路径最大和
        result = max(result, root->val + leftSum + rightSum);

        // 当前节点作为路径中的一个节点,所能贡献的最大值
        return root->val + max(leftSum, rightSum);
    }

    void dfs(TreeNode* root) {
        if(root == nullptr) {
            return;
        }
        if(result>root->val) {
            result = root->val;
        }
        dfs(root->left);
        dfs(root->right);
    }

};

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

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

相关文章

跟着《代码随想录》刷题(一)——数组

1.1 数组基础理论 (1)定义:数组是存储在连续内存空间上相同类型数据的集合。 (2)注意: 数组下标是从0开始的;数组在内存空间的地址是连续的。 >删除或增添数组元素难免要移动其他元素的地…

DynaSLAM-11 DynaSLAM中RGB-D运行流程(Ⅰ):调用Mask 初始化R-CNN网络

目录 1.执行例程rgbd_tum 2.SegmentDynObject::SegmentDynObject方法 3. SegmentDynObject::GetSegmentation 4.初始化SLAM系统 1.执行例程rgbd_tum /home/lhwnb/Desktop/slam/DynaSLAM/Examples/RGB-D/rgbd_tum /home/lhwnb/Desktop/slam/DynaSLAM/Vocabulary/ORBvoc.txt …

多线程与线程池demo

第一步&#xff1a;切割数据的方法 public static List<List<Integer>> getProcessData(Integer batchSize) {List<Integer> originData new ArrayList<>();for (int i 0; i < 100; i) {originData.add(i);}List<List<Integer>> proc…

深度学习笔记:神经网络的学习(2)

本章上一篇可见链接 https://blog.csdn.net/Raine_Yang/article/details/128682091?spm1001.2014.3001.5501 梯度下降法&#xff08;gradient descend&#xff09; 神经网络学习的目标是找到使损失函数最小的参数&#xff08;权重和偏置&#xff09;。通过求得损失函数&#…

【JavaEE】快速了解什么是Maven?

✨哈喽&#xff0c;大家好&#xff0c;我是辰柒&#xff01;✨ &#x1f6f0;️&#x1f6f0;️系列专栏:【JavaEE】 ✈️✈️本篇内容:学习如何使用maven&#xff01; &#x1f680;&#x1f680;代码存放仓库github&#xff1a;JavaEE代码&#xff01; ⛵⛵作者简介&#xff…

C++STL——stack与queue

stack与queuestack与queuepriority_queue容器适配器vector与list的反向迭代器模拟实现仿函数deque(了解)stack与queue模拟实现priority_queue模拟实现stack与queue 这两个就是之前数据结构学过的栈和队列&#xff0c;只不过多了几个接口。 stack&#xff1a; queue&#xff…

【MySQL】MySQL 8 的 JSON 新特性详解(1)JSON 数据类型

目录一、概述二、MySQL 8 的环境搭建三、创建数据库、数据表并插入默认数据四、JSON格式数据的增加和查询1. 增加一条带JOSN格式的数据2.查询JSON内数据3.带筛选条件的查询五、总结一、概述 你好&#xff0c;我是小雨青年&#xff0c;一名使用MySQL 8 的程序员。 MySQL 8 引入…

Hadoop安装(二) --- Hadoop安装

目录 Hadoop安装&#xff08;一&#xff09;---JDK安装 修改hadoop313的权限 更改配置文件 配置core-site.xml 配置hadoop-env.sh 配置hdfs-site.xml 配置mapred-site.xml 配置yarn-site.xml 配置环境 刷新当前的shell环境 初始化 启动所有 SH 修改hadoop31…

Android Studio 从安装到第一个Android 应用Demo

安装Android Studio 安装需要 上网 &#xff0c;我这挺顺利的&#xff0c;就是在官网下载安装包&#xff0c;一路 Next&#xff0c;大概连下载总共半个小时。 第一个应用 参考官方教程&#xff1a;https://developer.android.com/codelabs/basic-android-kotlin-compose-firs…

Redis最佳实践

一、Redis键值设计 1.1、优雅的key结构 Redis的key&#xff0c;最佳实践约定&#xff1a; 遵循基本格式&#xff1a;【业务名称】:【数据名】:【id】长度不超过44字节不包含特殊字符 好处 可读性强避免key冲突方便管理更节省内存 1.2、拒绝BigKey BigKey通常以Key的大小和…

SOLIDWORKS PDM的智能报表自动生成工具

一、SOLIDWORKS企业高级报表软件介绍&#xff1a; SolidKits.Reports&#xff08;企业高级报表&#xff09;是一款无缝集成于SOLIDWORKS PDM的智能报表自动生成工具&#xff0c;可以自动生成企业所需的各类报表数据&#xff0c;涵盖结构数据报表、离散数据报表、变更数据报表、…

rocketmq源码-consumer负载均衡逻辑

前言 这篇笔记主要记录consumer在启动过程中&#xff0c;负载均衡的逻辑&#xff0c;多个消费者组成一个消费者组&#xff0c;对于集群模式&#xff0c;同一个消费者组中的多个消费者共同消费一个topic下的所有消息&#xff0c;所以每个consumer可能会处理N个messageQueue&…

【4】KVM管理 | 虚拟机的管理 | 克隆 | 快照

目录 1、虚机基本管理 2、虚机的克隆 3、增量镜像 4、虚机快照 1、虚机基本管理 查看正在运行的虚机 [rootlocalhost ~]# virsh list Id Name State ----------------------------------------------------查看所有的虚机 [rootlocalhost ~…

Apache Oozie(1):Apache Oozie简介

1 Oozie 概述 Oozie 是一个用来管理 Hadoop 生态圈 job 的工作流调度系统。由Cloudera 公司贡献给 Apache。Oozie 是运行于 Java servlet 容器上的一个 java web 应用。Oozie 的目的是按照 DAG&#xff08;有向无环图&#xff09;调度一系列的 Map/Reduce或者Hive 等任务。Ooz…

Java SE 进阶(二)之 HashSet底层原理

文章目录前言HashSet底层原理1.哈希表2.哈希值3.底层原理4.回答三个问题前言 关于Set和HashSet的API使用可参见 集合基础入门&#xff08;Collection&#xff0c;ArrayList&#xff0c;HashSet&#xff0c;HashMap&#xff09; HashSet底层原理 1.哈希表 HashSet集合底层采…

Vue组件 —— 单文件组件

追溯vue组件问题 在未讲项目之前&#xff0c;在 这一篇内容当中就讲到了组件引入使用&#xff0c;有内置的组件和动态组件以及封装一个swiper组件&#xff0c;组件也分为全局组件和局部组件&#xff0c;在讲在项目当中去使用组件之前先简单的回顾一下组件的编写&#xff1a; &…

89.【SpringBoot-02】

SpringBoot聊一聊如何构建一个网站(十四)、.SpringBoot整合数据库操作1.整合JDBC(1).SpringData简介(2).整合JDBC(3).JdbcTemplate ⭐2. 整合Druid数据源 &#xff08;德鲁伊&#xff09;(1).Druid简介(2).配置数据源(3).配置Druid数据源监控(4).配置Druid数据源过滤器(5).注解…

Echarts的Y轴添加定值横线的示例

第010个点击查看专栏目录Echarts折线图的y轴要画一条横线&#xff0c;主要是在series中设置markLine的图表标线参数&#xff0c;具体的参考源代码。文章目录示例效果示例源代码&#xff08;共142行&#xff09;相关资料参考专栏介绍示例效果 示例源代码&#xff08;共142行&…

怎么在Windows电脑更新 DirectX ?

玩游戏的人应该都对DirectX不陌生&#xff0c;它可以提高游戏或多媒体程序的运行效率&#xff0c;增强3d图形和声音效果。但很多人都不知道DirectX该如何更新&#xff0c;这篇文章将以Win10为例&#xff0c;教大家怎么在电脑上更新DirectX。 一、检查当前DirectX版本 如果你不…

简单聊一聊组件封装

封装一个思维导图组件 最近封装了一个简单的思维导图组件&#xff0c;在此简单记录一下心里历程 组件样式 组件结构设计 节点之间的线分成三部分&#xff0c;分别是竖线左边的横线A、竖线B、竖线右边的横线C&#xff0c;所以一个节点可以包含以下几个元素&#xff1a; 横线…