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

阅读目录

    • 1. 题目
    • 2. 解题思路
    • 3. 代码实现

1. 题目

2. 解题思路

二叉树的问题首先我们要想想是否能用递归来解决,本题也不例外,而递归的关键是找到子问题。

我们首先来看看一棵最简单的树,也就是示例 1。这样的一棵树总共有六条路径,分别是:根节点、左节点-根节点、右节点-根节点、左节点、右节点、左节点-根节点-右节点,我们用一个大小为 6 的数组 rootSum 来分别表示这六条路径的路径和,那么所求的最大路径和即为 rootSum 的最大值。

需要注意,当某一个节点为空的时候,比如左节点为空,那么左节点-根节点路径和为根节点的值,左节点贡献值为 0。而单独左节点的路径不存在,路径和应该设置为一个极大的负值

接下来,我们再考虑一个更复杂的树,这棵树的根节点有左右两棵子树,每一棵子树都是类似上面示例 1 的一棵树。那么,我们可以很容易地得到左右子树的路径和数组 leftSumrightSum ,接下来,我们要做的就是如何根据这两个数组得到整棵树的路径和数组 rootSum

rootSum 仍然有 6 条路径,其中:

  • 只有一个根节点的路径,rootSum[0]=root->val
  • 左节点-根节点的路径,这时候由于左节点是一棵子树,所以,只有包含子树中根节点的路径才能继续和当前的根节点组成新的路径,也就是子树的前三条路径,然后我们取其中最大的一条即可,rootSum[1]=root->val + max(leftSum[0:3))
  • 右节点-根节点的路径,这个和上面的类似,rootSum[2]=root->val + max(rightSum[0:3))
  • 左节点,也即是单独左子树组成的最大路径,rootSum[3]=max(leftSum[0:6))
  • 右节点,也即是单独右子树组成的最大路径,rootSum[4]=max(rightSum[0:6))
  • 左节点-根节点-右节点,也就是左子树的路径包含左子树的根节点,右子树的路径包含右子树的根节点,rootSum[5]=max(leftSum[0:3))+ root->val + max(rightSum[0:3))

时间复杂度为 O ( n ) O(n) O(n) n n n 代表节点总数,每个节点都需要进行遍历一次,空间复杂度为 O ( n ) O(n) O(n),每个节点都需要存储 6 个状态值。

3. 代码实现

/*** 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:vector<int> getNodePathSum(TreeNode* root) {int leftRootSum = 0, leftMaxSum = -10000;if (root->left != nullptr) {vector<int> leftSum = getNodePathSum(root->left);leftRootSum = *std::max_element(leftSum.begin(), leftSum.begin() + 3);leftMaxSum = *std::max_element(leftSum.begin(), leftSum.end());}int rightRootSum = 0, rightMaxSum = -10000;if (root->right != nullptr) {vector<int> rightSum = getNodePathSum(root->right);rightRootSum = *std::max_element(rightSum.begin(), rightSum.begin() + 3);rightMaxSum = *std::max_element(rightSum.begin(), rightSum.end());}vector<int> rootSum(6, 0);rootSum[0] = root->val;rootSum[1] = leftRootSum + root->val;rootSum[2] = rightRootSum + root->val;rootSum[3] = leftMaxSum;rootSum[4] = rightMaxSum;rootSum[5] = leftRootSum + root->val + rightRootSum;return rootSum;}int maxPathSum(TreeNode* root) {vector<int> sum = getNodePathSum(root);return *std::max_element(sum.begin(), sum.end());}
};

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

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

相关文章

docker如何拉取nginx最新镜像并运行

要拉取Docker Hub上的最新Nginx镜像&#xff0c;您可以使用以下命令&#xff1a; docker pull nginx 这个命令会从Docker Hub下载最新版本的Nginx镜像。如果您想要拉取特定版本的Nginx镜像&#xff0c;可以指定版本号&#xff0c;例如&#xff1a; docker pull nginx:1.18.0 拉…

JQuery从入门到精通2万字面试题

目录 解释jQuery库中的$()函数是什么? 如何使用jQuery选择页面上的所有 元素?

详细分析tcping的基本知识以及用法

目录 前言1. 安装配置2. 基本知识3. Demo 前言 针对ping的基本知识推荐阅读&#xff1a;详细分析ping的基本知识以及常见网络故障的诊断&#xff08;图文解析&#xff09; 1. 安装配置 针对Window的下载如下&#xff1a; 安装路径&#xff1a;tcping官网 下载tcping.exe&a…

《微服务王国的守护者:Spring Cloud Dubbo的奇幻冒险》

5. 经典问题与解决方案 5.3 服务追踪与链路监控 在微服务架构的广袤宇宙中&#xff0c;服务间的调用关系错综复杂&#xff0c;如同一张庞大的星系网络。当一个请求穿越这个星系&#xff0c;经过多个服务节点时&#xff0c;如何追踪它的路径&#xff0c;如何监控整个链路的健康…

AIGC行业现在适合进入吗?

AIGC行业现在适合进入吗 人工智能生成内容&#xff08;AIGC&#xff0c;Artificial Intelligence Generated Content&#xff09;行业近年来迅速崛起&#xff0c;尤其在自然语言处理、图像生成和内容创作等方面取得了显著的进展。要判断当前是否适合进入AIGC行业&#xff0c;需…

C++ 实现深度优先搜索(DFS)的简单示例代码

C 实现深度优先搜索&#xff08;DFS&#xff09;的简单示例代码 #include <iostream> #include <vector> #include <stack>/**C 实现深度优先搜索&#xff08;DFS&#xff09;的简单示例代码。这段代码演示了如何在一个无向图中使用 DFS 进行遍历。 首先&am…

VUE3 学习笔记(3):VUE模板理念、属性绑定、条件渲染、列表渲染

准备 1.清空不必要的项目文件 项目/src/assets/ 目录文件清空 项目/src/components/ 目录文件清空 删除main.js 的css引用 App.vue 代码如下 <template> </template> <script>//注意这里默认有一个setup 去掉 </script> 运行一下无错误提示就可以了…

Android14音频进阶之dump各阶段音频数据<Tee Sink方案>(七十五)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+AOSP…

Cohere继Command-R+之后发布大模型Aya-23,性能超越 Gemma、Mistral 等,支持中文

前言 近年来&#xff0c;多语言大模型&#xff08;MLLM&#xff09;发展迅速&#xff0c;但大多数模型的性能依然存在显著差距&#xff0c;尤其是在非英语语言方面表现不佳。为了推动多语言自然语言处理技术的发展&#xff0c;Cohere团队发布了新的多语言指令微调模型家族——…

假设有n个台阶,一次只能上1个台阶或2个台阶,请问走到第n个台阶有几种走法?

假设有n个台阶&#xff0c;一次只能上1个台阶或2个台阶&#xff0c;请问走到第n个台阶有几种走法&#xff1f; 为方便读者理解题意&#xff0c;这里举例说明如下 &#xff0c;假如有3个台阶&#xff0c;那么总计就有三种走法&#xff1a;第一种为每次上1个台阶&#xff0c;上3…

机器学习预测-CNN手写字识别

介绍 这段代码是使用PyTorch实现的卷积神经网络&#xff08;CNN&#xff09;&#xff0c;用于在MNIST数据集上进行图像分类。让我一步步解释&#xff1a; 导入库&#xff1a;代码导入了必要的库&#xff0c;包括PyTorch&#xff08;torch&#xff09;、神经网络模块&#xff0…

shell脚本实战--批量修改文件名

字符串截取 先来了解一下shell字符串相关操作的变量 # 从开头删除匹配最短 ## 从开头删除匹配最长 % 从结尾削除匹配最短 %% 从结尾删除匹配最长#指定字符内容截取 a*c 匹配开头为a&#xff0c;中间任意个字符&#xff0c;结尾为c的字符串 a*C 匹配…

QCC---音频输出DAC\I2S\SPDIF切换

QCC---音频输出DAC\I2S\SPDIF切换 如何做PIO切换音频输出方式? /*! \copyright Copyright (c) 2020 - 2023 Qualcomm Technologies International, Ltd. All Rights Reserved. Qualcomm Technologies International, Ltd. Confidential and Proprietary. \version %%v…

Java—集合Collection(一)

Java—集合Collection&#xff08;一&#xff09; 一、Collection集合1、方法add、addAll2、声明集合特别注意1&#xff1a;添加对象时需要创建对象类 3、总结4、判断方法4.1、总结 5、删除6、总结7、集合的其他方法8、所有代码演练 存放单个数据内容&#xff0c;声明一个变量&…

netcat一键开始瑞士军刀模式(KALI工具系列六)

目录 1、KALI LINUX简介 2、netcat工具简介 3、在KALI中使用netcat 3.1 目标主机IP&#xff08;win&#xff09; 3.2 KALI的IP 4、命令示例 4.1 测试某IP的端口是否打开 4.2 TCP扫描 4.3 UDP扫描 4.4 端口刺探 4.5 直接扫描 5、即时通信 5.1 单击对话互联 5.2 传…

新能源锂电池行业创业的财富方案,锂电池回收高阶课

课程下载&#xff1a;https://download.csdn.net/download/m0_66047725/89292234 更多资源下载&#xff1a;关注我。 实战攻略 12年锂电池回收行业经验与坑全收录 课程内容&#xff1a; 001-课程介绍.mp4 002-锂电池的全种类认识.mp4 003-废品锂电池到级片粉末价值估算,mp…

VMware虚拟机安装的详细步骤要点和难点以及常见故障排除

以下是VMware虚拟机安装的详细步骤: 1.下载VMware: 访问VMware的官方网站(https://www.vmware.com/cn.html)。 在网站上找到适合您操作系统的VMware版本,并点击下载。通常,VMware Workstation Pro是最常用的版本。 2.安装VMware: 下载完成后,找到下载的VMware安装包…

Creo8.0装配体打开一部分零件不显示

装配体默认打开时一部分零件没显示&#xff0c;需要对没显示出来的零件或部件打开&#xff0c;再一更新CtrlG模型就可以了。 有时需要打开很多个模型 原因是那些没显示出来的模型在其他文件件中&#xff0c;如果把所有的部件和零件都放在一个文件夹中&#xff0c;则一打开都会…

Go微服务: Http服务注册在Consul的示例(非Go-Micro)

概述 现在&#xff0c;我们使用consul客户端的api来把Http服务注册到consul上&#xff0c;非Go-Micro的形式其实&#xff0c;consul官方提供了对应的接口调用来实现&#xff0c;golang中的consul/api包对其进行了封装我们使用consul/api来进行展示 目录结构 gitee.com/go-mi…

设计模式7——建造者模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用&#xff0c;主要是下面的UML图可以起到大作用&#xff0c;在你学习过一遍以后可能会遗忘&#xff0c;忘记了不要紧&#xff0c;只要看一眼UML图就能想起来了。同时也请大家多多指教。 建造者模式&#xff08;Builde…