day 18二叉树(五)

day18
代码随想录
2023.12.16

1. 513找树左下角的值
这道题很直观的就是想到层序遍历,最后一层的第一个节点值就是我们需要的,而且很偷懒的是,不用判断是不是最后一层,每一层第一个节点值都保存,会覆盖,最后的值就是我们要的。
最后看代码随想录还讲了递归写法,就是在递归时加了个深度变量,最深且是左节点的就是我们要找的值,挺麻烦的,不细说了

/*** 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 findBottomLeftValue(TreeNode* root) {queue<TreeNode*> que;if(root!=NULL) que.push(root);int result;while(!que.empty()){int size = que.size();for(int i=0;i<size;i++){TreeNode*node = que.front();que.pop();if(i==0) result = node->val;if(node->left) que.push(node->left);if(node->right) que.push(node->right);}}return result;}
};

2. 112路经总和
这道题跟前几天做的一道所有路径很相似,那道题是将所有路径要要求打印出来,这是求和,思路是一样的,只是在最终路径处理上不同,这道题在叶子节点是将path的值全部相加,如果==targetsum,则返回true即可。

/*** 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:bool hasPathSum(TreeNode* root, int targetSum) {vector<int> path;if(root==NULL) return false;return travel(root, path, targetSum);}bool travel(TreeNode*node, vector<int>& path, const int target){path.push_back(node->val);bool lefti=false;bool righti=false;if(node->left){lefti=travel(node->left, path, target);path.pop_back();}if(node->right){righti=travel(node->right, path, target);path.pop_back();}if(node->left==NULL && node->right==NULL){int sum=0;for(int i=0;i<path.size();i++){sum +=path[i];}cout<<sum<<endl;if(sum==target) return true;}return (lefti||righti);}
};

3. 106从中序和后续遍历结果构造二叉树
这道题是这道时间遇到的最难一题了。拿到后有些没有头绪,手写结果很简单,没什么那难度,但代码实现就不知道怎么写了,看了代码随想录文字讲解,悟了一点;
首先明确,是要递归处理的,每次传入两个数组,构造子树。重点是就是函数的实现。每次递归都是以后序遍历的最后一个元素为重点的,该元素就是本次递归的根节点,以该节点为中心,将中序遍历划分为两个部分,就是下次递归的左右子树的中序遍历结果。所以中序遍历很好切割,思路就是,根据后序遍历找到中心点,再在中序遍历找到中心点的位置,以该位置分割中序遍历数组;那么,后续遍历怎么分割?后续遍历没有中序遍历那么明显的分割点,但要知道,中序遍历和后序遍历的数组大小是相等的,所以知道中序遍历分割结果,可以根据该结果去按大小分割后续遍历,但要注意顺序。最终得到两个中序遍历,两个后序遍历,在分别匹配传给递归函数构造本次递归函数的根节点的左右子树。即可

/*** 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:TreeNode* traversal (vector<int>& inorder, vector<int>& postorder) {if (postorder.size() == 0) return NULL;// 后序遍历数组最后一个元素,就是当前的中间节点int rootValue = postorder[postorder.size() - 1];TreeNode* root = new TreeNode(rootValue);// 叶子节点if (postorder.size() == 1) return root;// 找到中序遍历的切割点int delimiterIndex;for (delimiterIndex = 0; delimiterIndex < inorder.size(); delimiterIndex++) {if (inorder[delimiterIndex] == rootValue) break;}// 切割中序数组// 左闭右开区间:[0, delimiterIndex)vector<int> leftInorder(inorder.begin(), inorder.begin() + delimiterIndex);// [delimiterIndex + 1, end)vector<int> rightInorder(inorder.begin() + delimiterIndex + 1, inorder.end() );// postorder 舍弃末尾元素postorder.resize(postorder.size() - 1);// 切割后序数组// 依然左闭右开,注意这里使用了左中序数组大小作为切割点// [0, leftInorder.size)vector<int> leftPostorder(postorder.begin(), postorder.begin() + leftInorder.size());// [leftInorder.size(), end)vector<int> rightPostorder(postorder.begin() + leftInorder.size(), postorder.end());root->left = traversal(leftInorder, leftPostorder);root->right = traversal(rightInorder, rightPostorder);return root;}TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {if (inorder.size() == 0 || postorder.size() == 0) return NULL;return traversal(inorder, postorder);}
};

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

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

相关文章

Mybatis配置-类型别名(typeAliases)

在Java中&#xff0c;类型别名&#xff08;Type Alias&#xff09;是一个用于简化某个类型的名称的方式。它在XML配置中特别有用&#xff0c;可以减少在全限定类名上繁琐的重复输入。例如&#xff1a; <typeAliases><typeAlias alias"Author" type"do…

grep -B指定输出前置行

要在grep命令输出关键字所在行的同时&#xff0c;再输出关键字的上两行&#xff0c;可以使用grep的-B选项来指定前置行数。下面是一个示例的代码&#xff1a; grep -B 2 "Unsuccessful" shyn在这个示例中&#xff0c;我们使用grep命令过滤出包含"Unsuccessful&q…

用Pyinstaller打包深度学习算法为独立的可执行程序

前言&#xff1a;随着深度学习算法的流行&#xff0c;在传统工业软件计算领域&#xff0c;传统算法逐渐被深度学习算法给代替&#xff0c;但由于基于python的深度学习算法十分依赖python环境以及例如Pytorch、Scikit-learning、Keras等机器学习库&#xff0c;将深度学习算法运用…

西南科技大学数字电子技术实验五(用计数器设计简单秒表)预习报告

一、计算/设计过程 说明&#xff1a;本实验是验证性实验&#xff0c;计算预测验证结果。是设计性实验一定要从系统指标计算出元件参数过程&#xff0c;越详细越好。用公式输入法完成相关公式内容&#xff0c;不得贴手写图片。&#xff08;注意&#xff1a;从抽象公式直接得出结…

UE5 PlaceActor

⚠️ 重点 PlaceActors 需在引擎初始化之后 但&#xff0c;单为这一个功能&#xff0c;更改整个模块的启动顺序&#xff0c;也不太划算 更好的办法是&#xff0c;启动顺序保持正常&#xff08;如"LoadingPhase": "Default" &#xff09;&#xff0c;然后…

Java EE 多线程之线程安全的集合类

文章目录 1. 多线程环境使用 ArrayList1. 1 Collections.synchronizedList(new ArrayList)1.2 CopyOnWriteArrayList 2. 多线程环境使用队列2.1 ArrayBlockingQueue2.2 LinkedBlockingQueue2.3 PriorityBlockingQueue2.4 TransferQueue 3. 多线程环境使用哈希表3.1 Hashtable3.…

innerHTML、innerText、textContent有什么区别

innerHTML、innerText、textContent有什么区别 在 HTML 中&#xff0c;innerHTML、innerText、 和textContent是 DOM&#xff08;文档对象模型&#xff09;的属性。它们允许我们读取和更新 HTML 元素的内容。 但它们在包含的内容以及处理 HTML 标签的方式有不同的行为。 读完…

分布式事务seata使用示例及注意事项

分布式事务seata使用示例及注意事项 示例说明代码调用方&#xff08;微服务A&#xff09;服务方&#xff08;微服务B&#xff09; 测试测试一 &#xff0c;seata发挥作用&#xff0c;成功回滚&#xff01;测试二&#xff1a;处理feignclient接口的返回类型从Integer变成String,…

【Spring Boot】快速入门

一、引言 1、什么是spring boot&#xff1f; Spring Boot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。通过这种方式&#xff…

LEFT JOIN 避坑指南

left join 通俗的解释&#xff1a;以左表为主表&#xff0c;返回左表的所有行&#xff0c;如果右表中没有匹配&#xff0c;则依然会有左表的记录&#xff0c;右表字段用null填充。 准备数据 假设有一个班级管理应用&#xff0c;有一个表classes&#xff0c;存了所有的班级&am…

【RocketMQ-Install】Windows 环境下安装 RocketMQ 及基础命令的使用

【RocketMQ-Install】Windows 环境下 安装本地 RocketMQ 及基础命令的使用 1&#xff09;下载 RocketMQ 安装包1.1.官网下载&#xff08;推荐&#xff09;1.2.Git 下载1.3.安装环境要求说明 2&#xff09;Windows 安装3&#xff09;基础命令测试 1&#xff09;下载 RocketMQ 安…

芯知识 | 什么是音频蓝牙播放语音芯片?

随着科技的不断进步&#xff0c;音频蓝牙播放语音芯片成为嵌入式音频系统中备受关注的创新解决方案。本文将深入解析什么是音频蓝牙播放语音芯片&#xff0c;以及其在实现无线音频体验方面的重要作用。 一、什么是音频蓝牙播放语音芯片&#xff1f; 音频蓝牙播放语音芯片是一…

Java:SpringBootTest指定profile

示例 指定使用test环境配置 SpringBootTest ActiveProfiles("test") public class APiServiceImplTest {}参考 spring boot-JUnit Test指定profile

多分类预测 | MATLAB实现CNN-LSTM-Attention多输入分类预测

分类预测 | MATLAB实现CNN-LSTM-Attention多输入分类预测 分类效果 需要源码和数据的私信&#xff08;微微有偿取哦&#xff09;

MyBatisPlus乐观锁插件

当要更新一条记录的时候&#xff0c;希望这条记录没有被别人更新&#xff0c;如果已经更新&#xff0c;则此时更新失败。 乐观锁实现方式 1&#xff09;取出记录时&#xff0c;获取当前 version&#xff1b; 2&#xff09;更新时&#xff0c;带上这个 version&#xff1b; 3&a…

通义千问 Qwen-72B-Chat在PAI-DSW的微调推理实践

01 引言 通义千问-72B&#xff08;Qwen-72B&#xff09;是阿里云研发的通义千问大模型系列的720亿参数规模模型。Qwen-72B的预训练数据类型多样、覆盖广泛&#xff0c;包括大量网络文本、专业书籍、代码等。Qwen-72B-Chat是在Qwen-72B的基础上&#xff0c;使用对齐机制打造的…

主宰无双H5:WIN学习手工服务端通用视频教程及GM授权物品后台,支持三网H5玩法介绍

标题&#xff1a;主宰无双H5&#xff08;游戏源码&#xff09;&#xff1a;WIN学习手工服务端通用视频教程及GM授权物品后台&#xff0c;支持三网H5玩法的百科 一、引言 随着互联网的快速发展&#xff0c;H5游戏逐渐成为人们休闲娱乐的重要方式。主宰无双H5游戏源码作为一款深…

Android解决报错 superclass access check failed: class

Android解决报错 superclass access check failed: class 前言&#xff1a; 最近在打开之前的项目demo时&#xff0c;出现一个错误Cause: superclass access check failed: class butterknife.compiler.ButterKnifeProcessor$RScanner 1.错误信息如下&#xff1a; Executio…

《Linux C编程实战》笔记:目录操作

目录的创建和删除 mkdir函数 #include <sys/stat.h> #include <sys/types.h> int mkdir(const char *pathname, mode_t mode); mkdir创建一个新的空目录。空目录中会自动创建.和..目录项。所创建的目录的存取许可权由mode (mode &~umask)指定。 新创建目录的…