LeetCodehot 力扣热题100

class Solution {
public:
    int max_sum = INT_MIN;  // 初始化为最小值,确保能够处理所有可能的路径和

    int maxPathSum(TreeNode* root) {
        dfs(root);
        return max_sum;
    }

    int dfs(TreeNode* root) {
        if (root == nullptr) return 0;  // 如果是空节点,返回0
        
        // 递归计算左子树和右子树的最大路径和,负值则不贡献路径和
        int left = max(0, dfs(root->left));  // 只考虑正路径
        int right = max(0, dfs(root->right));  // 只考虑正路径

        // 计算当前节点的最大路径和,包括根节点与左、右子树的路径
        max_sum = max(max_sum, root->val + left + right);

        // 返回当前节点的最大贡献值
        return root->val + max(left, right);  // 返回当前节点的最大路径和(要么包括左子树,要么右子树)
    }
};

路径上的节点最多有两个相邻节点。

好的,接下来我会详细解析你之前提到的 二叉树最大路径和 代码的思路。

问题说明

最大路径和问题的目标是:在一个二叉树中找到一条路径,使得路径上的节点值的和最大。这条路径可以通过任意节点,不需要从根节点开始,并且路径可以穿越树的多个分支。

• max_sum 作为一个全局变量,用来存储二叉树中计算出来的最大路径和。初始化为 0,代表我们初始时尚未计算任何路径的和。

2. maxPathSum 函数

int maxPathSum(TreeNode* root) {

    dfs(root);  // 从根节点开始,递归计算最大路径和

    return max_sum;  // 返回最大路径和

}

• maxPathSum 是主要的接口函数,它接收二叉树的根节点 root 作为输入,调用 dfs 函数计算路径和。

• 调用 dfs(root) 会触发对整个树的深度优先搜索。

• 最后返回 max_sum,这个变量会保存二叉树中遍历得到的最大路径和。

3. 深度优先搜索 dfs 函数

int dfs(TreeNode* root) {

    if (root == nullptr) return 0;  // 递归边界:如果节点为空,路径和为0

• dfs 是一个递归函数,负责从当前节点计算出其左右子树的路径和,并更新 max_sum。

• 如果当前节点是 nullptr(即为空节点),直接返回 0,因为空节点对路径和没有任何贡献。

int left = max(0, dfs(root->left));  // 计算左子树的最大路径和,若为负数则不贡献,返回0

int right = max(0, dfs(root->right));  // 计算右子树的最大路径和,若为负数则不贡献,返回0

• 计算当前节点的左子树和右子树的最大路径和。

• 对于每个子树,我们希望只考虑正路径和(即如果某个子树的路径和是负数,那么我们就不考虑这条路径)。因此,使用 max(0, dfs(...)) 来确保如果子树的路径和为负数,则返回 0,表示我们不选取该子树。

• dfs(root->left) 和 dfs(root->right) 分别递归地计算左子树和右子树的最大路径和。

max_sum = max(max_sum, root->val + left + right);  // 以当前节点为根的路径和

• 现在我们计算的是通过当前节点 root 的路径和,这个路径包括:

• 当前节点的值 root->val

• 左子树的最大路径和 left

• 右子树的最大路径和 right

• max_sum 会更新为当前路径和和之前的最大路径和中的较大值。

return root->val + max(left, right);  // 返回当前节点的最大路径和

• 由于路径不能跨越多个分支,因此我们只能选择单边(左子树或右子树)继续延伸路径。返回当前节点的最大路径和时,我们只选择左子树和右子树中的较大者:

• root->val + max(left, right) 表示包括当前节点和其较大子树路径和的最大路径和。

4. 递归的执行流程

• 从根节点开始递归。

• 对于每个节点:

• 计算左右子树的最大路径和(递归调用 dfs)。

• 更新全局变量 max_sum。

• 返回当前节点的最大路径贡献(选择左子树或右子树的较大路径)。

• 最终 max_sum 就包含了整棵树的最大路径和。

代码执行流程(示例)

假设有以下二叉树:

       1

      / \

     2   3

    / \

   4   5

1. 调用 maxPathSum(root),根节点是 1:

• 进入 dfs(1)。

2. dfs(1):

• 左子树是 2,右子树是 3,开始计算左右子树的路径和。

3. 计算 dfs(2)(左子树):

• 左子树是 4,右子树是 5,继续递归。

4. 计算 dfs(4):

• 节点 4 没有子树,返回 4。

5. 计算 dfs(5):

• 节点 5 没有子树,返回 5。

6. 计算 dfs(2):

• left = 4,right = 5,节点 2 的路径和是 2 + 4 + 5 = 11。

• 更新 max_sum = 11。

• 返回 2 + max(4, 5) = 7。

7. 计算 dfs(3)(右子树):

• 节点 3 没有子树,返回 3。

8. 计算 dfs(1)(根节点):

• left = 7,right = 3,节点 1 的路径和是 1 + 7 + 3 = 11,max_sum 不变。

• 返回 1 + max(7, 3) = 8。

9. 最终结果:

• max_sum = 11,即树中的最大路径和是 4 -> 2 -> 5 或 4 -> 2 -> 1 -> 3。

总结

1. 深度优先搜索:通过递归遍历树中的每个节点,计算以每个节点为根的最大路径和。

2. 路径和的更新:对于每个节点,计算包括其左右子树的路径和,并更新全局最大路径和 max_sum。

3. 递归的返回值:每个节点返回的路径和代表它向上回溯的贡献,它是当前节点值与左、右子树最大路径和中的较大者之和。

这种方法的时间复杂度是 O(n),其中 n 是二叉树的节点数,因为每个节点只会被访问一次。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【服务器与本地互传文件】远端服务器的Linux系统 和 本地Windows系统 互传文件

rz 命令:本地上传到远端 rz 命令:用于从本地主机上传文件到远程服务器 rz 是一个用于在 Linux 系统中通过 串口 或 SSH 上传文件的命令,它实际上是 lrzsz 工具包中的一个命令。rz 命令可以调用一个图形化的上传窗口,方便用户从本…

Unity贴图与模型相关知识

一、贴图 1.贴图的类型与形状 贴图类型 贴图形状 2.在Unity中可使用一张普通贴图来生成对应的法线贴图(但并不规范) 复制一张该贴图将复制后的贴图类型改为Normal Map 3.贴图的sRGB与Alpha sRGB:勾选此选项代表此贴图存储于Gamma空间中…

Python----数据结构(哈希表:哈希表组成,哈希冲突)

一、哈希表 哈希表(Hash table)是一种常用、重要、高效的数据结构。 哈希表通过哈希函数,可以快速地将键(Key)映射到值(Value)。从而允许在近常数时间内对键关联的值进行插入、删除和查找操作。 哈希表的主要思想是通过哈希函数将键转换为索引,将索引映射到数组中…

java方法学习

java 方法 在Java中,方法是类(或对象)的行为或功能的实现。(一起实现一个功能)java的方法类似于其他语言的函数,是一段用来完成特定功能的代码片段。 方法是解决一类问题步骤的有序结合。 方法包含于类或…

网络运维学习笔记 015网工初级(HCIA-Datacom与CCNA-EI)NAT网络地址转换

文章目录 NAT(Network Address Translation,网络地址转换)思科:1)PAT2)静态端口转换 华为:1)EasyIP2)NAT Server静态NAT:动态NAT:实验1:在R1上配置NAPT让内网…

强化学习的数学原理-六、随机近似与随机梯度下降

代码来自up主【强化学习的数学原理-作业】GridWorld示例代码(已更新至DQN、REINFORCE、A2C)_哔哩哔哩_bilibili SGD、GD、MGD举例: # 先初始化一个列表,未来要在这100个样本里面再sample出来 np.random.seed(0) X np.linspace(-…

问卷数据分析|SPSS实操之相关分析

皮尔逊还是斯皮尔曼的选取主要看数据的分布 当数据满足正态分布且具有线性关系时,用皮尔逊相关系数 当有一个不满住时,用斯皮尔曼相关系数 1. 选择分析--相关--双变量 2. 将Z1-Y2加入到变量中,选择皮尔逊 3. 此处为结果,可看我案…

jsherp importItemExcel接口存在SQL注入

一、漏洞简介 很多人说管伊佳ERP(原名:华夏ERP,英文名:jshERP)是目前人气领先的国产ERP系统虽然目前只有进销存财务生产的功能,但后面将会推出ERP的全部功能,有兴趣请帮点一下 二、漏洞影响 …

解决华硕主板的Boot界面无法设置M.2的系统启动盘问题

一、问题描述 当我们的华硕主板电脑开机后,发现电脑无法正常进入Windows系统界面,直接显示PXE网络网络信息;且知道我们进入到BIOS界面也无法找到选择系统盘,界面只显示【UEFI:PXE IP4 Intel(R) Ethernet】、【UEFI:PXE IP6 Intel(…

BuildFarm Worker 简要分析

更多BuildFarm/Bazel/Remote Execution API的文章见我的个人博客: Bazel 报错:/tmp/external/gcc_toolchain_x86_64_files/bin/x86_64-linux-gcc: No such file or directory 记录Bazel 编译 java 代码为独立运行的 jar 包的方法BuildFarm S…

docker修改镜像默认存储路径(基于页面迁移)

文章目录 1、停止服务2、拷贝镜像3、docker界面设置路径4、重新启动服务5、重启电脑 1、停止服务 桌面底部右键打开任务管理器 停止docker服务 2、拷贝镜像 从原目录拷贝到新的目录下,新的目录自己定,如果没有权限,需要先对原文件添加权限…

基于ffmpeg+openGL ES实现的视频编辑工具-opengl相关逻辑(五)

在我们的项目中,OpenGL ES 扮演着至关重要的角色,其主要功能是获取图像数据,经过一系列修饰后将处理结果展示到屏幕上,以此实现各种丰富多样的视觉效果。为了让大家更好地理解后续知识,本文将详细介绍 OpenGL 相关代码。需要注意的是,当前方案将对 OpenGL 的所有操作都集…

机器学习实战(7):聚类算法——发现数据中的隐藏模式

第7集:聚类算法——发现数据中的隐藏模式 在机器学习中,聚类(Clustering) 是一种无监督学习方法,用于发现数据中的隐藏模式或分组。与分类任务不同,聚类不需要标签,而是根据数据的相似性将其划…

七星棋牌顶级运营产品全开源修复版源码教程:6端支持,200+子游戏玩法,完整搭建指南(含代码解析)

棋牌游戏一直是移动端游戏市场中极具竞争力和受欢迎的品类,而七星棋牌源码修复版无疑是当前行业内不可多得的高质量棋牌项目之一。该项目支持 6大省区版本(湖南、湖北、山西、江苏、贵州),拥有 200多种子游戏玩法,同时…

uniapp邪门事件

很久之前在这篇《THREEJS 在 uni-app 中使用(微信小程序)》:THREEJS 在 uni-app 中使用(微信小程序)_uni-app_帶刺的小葡萄-华为开发者空间 中学到了如何在uniapp的微信小程序里接入three.js的3d模型 由于小程序自身很…

【OS安装与使用】part6-ubuntu 22.04+CUDA 12.4运行MARL算法(多智能体强化学习)

文章目录 一、待解决问题1.1 问题描述1.2 解决方法 二、方法详述2.1 必要说明2.2 应用步骤2.2.1 下载源码并安装2.2.2 安装缺失的依赖项2.2.3 训练执行MAPPO算法实例 三、疑问四、总结 一、待解决问题 1.1 问题描述 已配置好基础的运行环境,尝试运行MARL算法。 1…

人工智能(AI)的不同维度分类

人工智能(AI)的分类 对机器学习进行分类的方式多种多样,可以根据算法的特性、学习方式、任务类型等不同维度进行分类这些分类都不是互斥的: 1、按数据模态不同:图像,文本,语音,多态等 2、按目标函数不同:判别式模型…

从零开始用react + tailwindcs + express + mongodb实现一个聊天程序(一)

项目包含5个模块 1.首页 (聊天主页) 2.注册 3.登录 4.个人资料 5.设置主题 一、配置开发环境 建立项目文件夹 mkdir chat-project cd chat-project mkdir server && mkdir webcd server npm init cd web npm create vitelatest 创建前端项目时我们选择javascrip…

【论文精读】VLM-AD:通过视觉-语言模型监督实现端到端自动驾驶

论文地址: VLM-AD: End-to-End Autonomous Driving through Vision-Language Model Supervision 摘要 人类驾驶员依赖常识推理来应对复杂多变的真实世界驾驶场景。现有的端到端(E2E)自动驾驶(AD)模型通常被优化以模仿…

基于Springboot学生宿舍水电信息管理系统【附源码】

基于Springboot学生宿舍水电信息管理系统 效果如下: 系统登陆页面 系统用户首页 用电信息页面 公告信息页面 管理员主页面 用水信息管理页面 公告信息页面 用户用电统计页面 研究背景 随着高校后勤管理信息化的不断推进,学生宿舍水电管理作为高校后勤…