代码随想录_二叉树_leetcode112、113

news2025/6/11 8:20:16

leetcode112 路径总和

112. 路径总和

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。

叶子节点 是指没有子节点的节点。

示例 1:

输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true
解释:等于目标和的根节点到叶节点路径如上图所示。

示例 2:

输入:root = [1,2,3], targetSum = 5
输出:false
解释:树中存在两条根节点到叶子节点的路径:
(1 --> 2): 和为 3
(1 --> 3): 和为 4
不存在 sum = 5 的根节点到叶子节点的路径。

示例 3:

输入:root = [], targetSum = 0
输出:false
解释:由于树是空的,所以不存在根节点到叶子节点的路径。

代码

// leetcode112 路径总和
// 递归
// 
class Solution {
public:
	bool dfs(TreeNode* cur, int target)
	{
		if (cur->left == nullptr && cur->right == nullptr) //说明是叶子结点
		{
			if (target == 0)
			{
				return true;
			}
			else
			{
				return false;
			}
		}
		if (cur->left != nullptr)
		{
			if (dfs(cur->left, target - cur->left->val))
			{
				return true;
			}
		}
		if (cur->right != nullptr)
		{
			if (dfs(cur->right, target - cur->right->val))
			{
				return true;
			}
		}
		return false;
	}

	bool hasPathSum(TreeNode* root, int targetSum) {
		if (root == nullptr)
		{
			return false;
		}
		return dfs(root, targetSum - root->val);
	}
};

//迭代遍历 即可
class Solution {
public:
	bool hasPathSum(TreeNode* root, int targetSum) {
		if (root == nullptr)
		{
			return false;
		}
		stack<pair<TreeNode*, int>> treeSta; // <结点,剩余值>
		treeSta.push(make_pair(root, targetSum - root->val));
		while (!treeSta.empty())
		{
			auto iter = treeSta.top();
			treeSta.pop();
			if (iter.second == 0 && iter.first->left == nullptr && iter.first->right == nullptr)
			{
				return true;
			}
			if (iter.first->left != nullptr)
			{
				treeSta.push(make_pair(iter.first->left, iter.second - iter.first->left->val));
			}
			if (iter.first->right != nullptr)
			{
				treeSta.push(make_pair(iter.first->right, iter.second - iter.first->right->val));
			}
		}
		return false;
	}
};

leetcode113.路径总和ii

113. 路径总和 II

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。

叶子节点 是指没有子节点的节点。

示例 1:

输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出:[[5,4,11,2],[5,8,4,5]]

示例 2:

输入:root = [1,2,3], targetSum = 5
输出:[]

示例 3:

输入:root = [1,2], targetSum = 0
输出:[]

 代码

// leetcode113 路径总和2
// 递归回溯
class Solution {
public:
	void dfs(TreeNode* cur, int target, vector<int>& path, vector<vector<int>>& result)
	{
		if (cur->left == nullptr && cur->right == nullptr) //说明是叶子结点
		{
			if (target == 0)
			{
				result.push_back(path);
			}
			return;
		}
		if (cur->left != nullptr)
		{
			path.push_back(cur->left->val);
			dfs(cur->left, target - cur->left->val, path, result);
			path.pop_back();
		}
		if (cur->right != nullptr)
		{
			path.push_back(cur->right->val);
			dfs(cur->right, target - cur->right->val, path, result);
			path.pop_back();
		}
	}

	vector<vector<int>> pathSum(TreeNode* root, int targetSum) {
		if (root == nullptr)
		{
			return {};
		}
		vector<int> path;
		vector<vector<int>> result;
		path.push_back(root->val);
		dfs(root, targetSum - root->val, path, result);
		return result;
	}
};

//迭代遍历
class Solution {
public:
	vector<vector<int>> pathSum(TreeNode* root, int targetSum) {
		if (root == nullptr)
		{
			return {};
		}
		vector<vector<int>> result; // 结果
		stack<pair<TreeNode*, int>> treeSta;  // 每个结点----targetSum-当前结点路径所有值的和
		stack<vector<int>> pathSta;           //和上面这个栈是同步的,存放路径
		treeSta.push(make_pair(root, targetSum - root->val));
		vector<int> path;
		path.push_back(root->val);
		pathSta.push(path);
		
		while (!pathSta.empty() && !pathSta.empty())
		{
			auto treeIter = treeSta.top();
			treeSta.pop();
			path = pathSta.top();
			pathSta.pop();

			if (treeIter.second == 0 && treeIter.first->left == nullptr && treeIter.first->right == nullptr)
			{
				result.push_back(path);
			}

			if (treeIter.first->right != nullptr)
			{
				treeSta.push(make_pair(treeIter.first->right, treeIter.second - treeIter.first->right->val));
				path.push_back(treeIter.first->right->val);
				pathSta.push(path);
				path.pop_back();//因为左子树可能也不为空所以要把新加入的值弹出
			}
			if (treeIter.first->left != nullptr)
			{
				treeSta.push(make_pair(treeIter.first->left, treeIter.second - treeIter.first->left->val));
				path.push_back(treeIter.first->left->val);
				pathSta.push(path);
				path.pop_back(); // 这里其实就无所谓了 这两个if顺序无所谓
			}
		}
		return result;
	}
};

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

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

相关文章

【血泪建议】软件测试岗位现状,可惜之前没人告诉我,肠子都晦青了....

谈到现状&#xff0c;国内的软件测试行情目前呈现了两极分化的极端情况。 一个是早期的手工测试人员吐槽工作不好做&#xff0c;即使有工作也是外包&#xff0c;而且薪资太低&#xff1b;一方面是很多互联网企业感叹自动化测试人才难找&#xff0c;有技术的自动化测试工程师&a…

Linux中执行命令

目录 一、命令格式 二、查看命令帮助 三、date命令 四、timedatectl命令 五、查看目录下的文件&#xff1a;ls&#xff08;list&#xff09; 一、命令格式 命令格式&#xff1a;主命令 选项 参数&#xff08;操作对象&#xff09; 命令分为两类&#xff1a; 内置命…

要刹车?生成式AI迎新规、行业连发ChatGPT“警报”、多国考虑严监管

4月13日消息&#xff0c;据中国移动通信联合会元宇宙产业工作委员会网站&#xff0c;中国移动通信联合会元宇宙产业工作委员会、中国通信工业协会区块链专业委员会等&#xff0c;共同发布“关于元宇宙生成式人工智能&#xff08;类 ChatGPT&#xff09;应用的行业提示”。提示内…

wmv格式的视频怎么转成mp4,4种方法简单易学

你知道wmv格式的视频怎么转成mp4吗&#xff1f;wmv和mp4都是视频文件格式&#xff0c;wmv格式是由微软开发的一种数字容器格式&#xff0c;它主要适用于电脑客户端。但由于其兼容性不佳&#xff0c;可能导致无法播放或出现错误。相比之下&#xff0c;mp4格式具有更广泛的兼容性…

Maven项目的JDK版本不一致引发的问题

1.运行提示java: 错误: 不支持发行版本 5&#xff08;改成JDK8&#xff09; 2.运行提示java&#xff1a;-source 8 中不支持 instanceof 中的模式匹配(改成JDK17) 解决方案&#xff08;以JDK8为例&#xff09; 1.普通Maven项目 通过指定Maven插件的JDK版本解决 <build>…

使用CentOS8实现Nginx负载均衡反向代理与安装MySQL数据库(涉及CentOS8、Nginx、MySQL、Flask)

文章目录1. 安装并配置CentOS8虚拟机1.1 安装1.2 设置静态IP(看需求不一定要设置)1.3 开启SSH\开启关闭端口\关闭开启防火墙1.4 虚拟机与本机互相复制粘贴、传输文件2. 如何在CentOS 8安装Python3. 解决错误&#xff1a;为 repo appstream 下载元数据失败4. 安装Nginx4.1 [关于…

Shader Graph8-输入Vector

一、三个向量 Vector叫做矢量或者向量&#xff0c;向量更偏向于数学&#xff0c;矢量更偏向于图形。下面三种Vector我们用的最多&#xff0c;红色叫Camera Vector相机向量、蓝色叫Surface Normal表面法线、黄色叫Light Vector光向量。 每个面都有法线&#xff0c;法线向量是这…

七大排序算法

文章目录1. 冒泡排序2. 插入排序3. 希尔排序4. 选择排序5. 堆排序6. 快速排序7. 归并排序1. 冒泡排序 从 0 号下标开始遍历&#xff0c;相邻两个数相互比较&#xff0c;如果左边的数大于右边的数&#xff0c;执行交换操作&#xff0c;最终每一趟冒泡都会将一个最大的数移到最右…

matplotlib使用

文章目录基本语法导入库plt 和ax.区别ax. 用法子图创建-展示不同的分区区域设置刻度范围&#xff1a;显示刻度设置刻度标签tick_params()函数添加轴坐标标签&#xff0c;表头&#xff0c;图例plt.用法普通折线图plt.plot(x,y,format_string,**kwargs)函数说明&#xff1a;中文显…

chapter-1数据管理技术的发展

以下课程来源于MOOC学习—原课程请见&#xff1a;数据库原理与应用 数据管理技术的发展 发展三阶段 人工管理【1950前】 采用批处理&#xff1b;主要用于科学计算&#xff1b;外部设备只有磁带&#xff0c;卡片&#xff0c;纸带等 特点&#xff1a;1.数据面向应用2.数据不保…

python注释方式

计算机语言的注释基本都是一样的作用 一个是 我这段代码可能之后还要用 但现在没用 我先注释在这里 他不会参与运行 但我想用了 直接打开注释 他就正常运行了 还要就是 用 注释 解释你代码的作用 方法呢 单行注释 以警号开头 右侧内容即为注释 print(666) print(130.33) #pr…

STM32之增量式编码器电机测速

STM32之增量式编码器电机测速编码器编码器种类按监测原理分类光电编码器霍尔编码器按输出信号分类增量式编码器绝对式编码器编码器参数分辨率精度最大响应频率信号输出形式编码器倍频STM32的编码器模式编码器模式编码器的计数方向仅在TI1计数电机正转&#xff0c;向上计数。电机…

卷麻了,00后测试用例写的比我还好,简直无地自容.....

前言 作为一个测试新人&#xff0c;刚开始接触测试&#xff0c;对于怎么写测试用例很头疼&#xff0c;无法接触需求&#xff0c;只能根据站在用户的角度去做测试&#xff0c;但是这样情况会导致不能全方位的测试APP&#xff0c;这种情况就需要一份测试用例了&#xff0c;但是不…

服务(第五篇)Nginx!!!

Nginx和Apache的差异? Nginx是一个基于事件的Web服务器&#xff0c;Apache是一个基于流程的Web服务器; Nginx所有请求都由一个线程处理&#xff0c;Apache单个线程处理单个请求; Nginx异步非阻塞的&#xff0c;Apache是阻塞的; Nginx在内存消耗和连接方面更好&#xff0c;Apa…

【JAVA】#详细介绍!!! synchronized 加锁 详解(2)

本篇主要是针对 synchronized锁的优化过程来介绍&#xff0c;针对synchronized的加锁优化过程来了解上篇所提到的synchronized的锁特性。 目录 1. synchronized锁的特性 2.synchronized 锁的升级过程 2.1 总过程&#xff1a; 2.2 偏向锁 2.3 轻量级锁 2.3.1自旋锁vs自适应…

网络安全之认识勒索病毒

一、什么是勒索病毒 勒索病毒&#xff0c;是一种新型电脑病毒&#xff0c;伴随数字货币兴起&#xff0c;主要以邮件、程序木马、网页挂马、服务器入侵、捆绑软件等多种形式进行传播&#xff0c;一旦感染将给用户带来无法估量的损失。如果遭受勒索病毒攻击&#xff0c;将会使绝…

Flink任务提交流程

抽象流程 抽象级别&#xff1a;不管是什么模式&#xff0c;大体上就是上面这个流程。 任务提交给分发器分发器把任务提交给JobManager上的JobMaster组件JobMaster收到任务之后&#xff0c;就会想JobManager上的ResourceManager去请求SlotJobManager上的ResourceManager会提供给…

3.1.2栈的顺序存储实现

&#xff08;1&#xff09;初始化一个顺序栈/栈的判空操作 与顺序表的声明类似 就是要加上一个栈顶指针top 然后把别名SqList改为SqStack 我们发现top指针的大小就是数组下标。 当空栈时&#xff0c;top指针为-1. &#xff08;2&#xff09;进栈操作 ep&#xff1a;插入一…

版本控制:git的基本使用

1.git基本介绍及安装 学习网址&#xff1a;Git - Book 安装步骤: Git - 安装 Git 安装完可以在本地电脑上查看&#xff1a; cmd为windows环境 bash为linux的环境 2. Git常用命令 牛客网项目——前置技术&#xff08;五&#xff09;&#xff1a;版本控制_平什么阿的博客-C…

ffmpeg关于视频前几秒黑屏的问题解决

关于音频播放器视频前两秒黑屏的解决&#xff0c;及QtAV和ffmpeg的环境搭建&#xff08;软件包可以找李青璠提供&#xff0c;也可以自己下&#xff09;首先我们可以参考下面两个博客进行ffmpeg的搭建&#xff0c;第一个博客的问题可以在第二个博客里寻求方法解决。其中第一个博…