C++从零开始的打怪升级之路(day46)

这是关于一个普通双非本科大一学生的C++的学习记录贴

在此前,我学了一点点C语言还有简单的数据结构,如果有小伙伴想和我一起学习的,可以私信我交流分享学习资料

那么开启正题

今天分享的是关于二叉树的题目

1.从前序与中序遍历序列构造二叉树

105. 从前序与中序遍历序列构造二叉树

给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

这道题是很经典的二叉树题目,原理就是利用前序插入数据,中序判断左右子树,构建二叉树,利用了前序和中序的性质,同时也利用了递归的思想

class Solution {
public:TreeNode* _buildTree(vector<int>&preorder, vector<int>& inorder, int inbegin, int inend, int& prei){//判断是否需要构建if(inbegin > inend)return nullptr;//构建头结点TreeNode* root = new TreeNode(preorder[prei]);//查找分隔点int rooti = inbegin;while(rooti <= inend){if(inorder[rooti] == preorder[prei])break;else++rooti;}//如果有数据递归链接左右子树if(inbegin <= rooti - 1)root->left = _buildTree(preorder, inorder, inbegin, rooti - 1, ++prei);if(rooti + 1 <= inend)root->right = _buildTree(preorder, inorder, rooti + 1, inend, ++prei);return root;}TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {int inbegin = 0, inend = inorder.size() - 1, prei = 0;//原函数无法直接完成递归,借助子函数完成TreeNode* ret = _buildTree(preorder, inorder, inbegin, inend, prei);return ret;}
};

这是ac代码 

2.从中序与后序遍历蓄力构造二叉树

106. 从中序与后序遍历序列构造二叉树

给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 

这题与上面的题是姊妹题,仅有细微的差别,这里直接给代码

class Solution {
public:TreeNode* _buildTree(vector<int>& inorder, vector<int>& postorder, int inbegin, int inend, int& posti){//判断是否需要构建if(inbegin > inend)return nullptr;//创建头结点TreeNode* root = new TreeNode(postorder[posti]);//查找分隔点int rooti = inbegin;while(rooti <= inend){if(inorder[rooti] == postorder[posti])break;else++rooti;}//递归创建左右子树并链接if(rooti + 1 <= inend)root->right = _buildTree(inorder, postorder, rooti + 1, inend, --posti);if(inbegin <= rooti - 1)root->left = _buildTree(inorder, postorder, inbegin, rooti - 1, --posti);return root;}TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder){   int inbegin = 0, inend = inorder.size() - 1, posti = postorder.size() - 1;TreeNode* ret = _buildTree(inorder, postorder, inbegin, inend, posti);return ret;}
};

这是ac代码 

3.二叉树的前序遍历

144. 二叉树的前序遍历

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

二叉树的三种遍历,在前面的学习都已经很熟悉了,这里我们着重要掌握的是非递归的方法,也是以后面试的一个小难题

这里先给出简单的递归解决办法

class Solution {
public:void _preorderTraversal(TreeNode* root, vector<int>& v){if(root == nullptr)return;v.push_back(root->val);_preorderTraversal(root->left, v);_preorderTraversal(root->right, v);}vector<int> preorderTraversal(TreeNode* root) {   vector<int> v;_preorderTraversal(root, v);return v;}
};

那么,非递归方法要如何求解呢,首先我们要明白,非递归方法是利用迭代来实现的,但其原理还是根据递归的办法来解决的,实际运用中,递归由于要不停的创建函数栈帧,有效率损耗(实际上优化后,时间差的并不多),以及可能导致栈溢出,所以我们才需要掌握非递归办法

非递归办法要创建一个stack,push进vector同时,入栈,在栈内模拟递归

class Solution {
public:vector<int> preorderTraversal(TreeNode* root) {vector<int> v;stack<TreeNode*> st;TreeNode* cur = root;while(cur || !st.empty()){while(cur){st.push(cur);v.push_back(cur->val);cur = cur->left;}TreeNode* top = st.top();st.pop();cur = top->right;}return v;}
};

这是ac代码

4.二叉树的中序遍历

94. 二叉树的中序遍历

和前序遍历如出一辙,这里直接给出递归代码,以及非递归代码

a.递归方法

class Solution {
public:void _inorderTraversal(TreeNode* root, vector<int>& v) {if(root == nullptr)return;_inorderTraversal(root->left, v);v.push_back(root->val);_inorderTraversal(root->right, v);}vector<int> inorderTraversal(TreeNode* root) {vector<int> v;_inorderTraversal(root, v);return v;}
};

b.非递归方法

class Solution {
public:vector<int> inorderTraversal(TreeNode* root) {vector<int> v;stack<TreeNode*> st;TreeNode* cur = root;while(cur || !st.empty()){while(cur){st.push(cur);cur = cur->left;}TreeNode* top = st.top();st.pop();v.push_back(top->val);cur = top->right;}return v;}
};

5.二叉树的后序遍历

和上面的题相似,但是后序遍历要更复杂一点,因为要最后读取根,所以我们要记录读取的值,判断是否遍历完了子树再对根进行读取

class Solution {
public:void _postorderTraversal(TreeNode* root, vector<int>& v){if(!root)return;_postorderTraversal(root->left, v);_postorderTraversal(root->right, v);v.push_back(root->val);}vector<int> postorderTraversal(TreeNode* root) {vector<int> v;_postorderTraversal(root, v);return v;}
};
class Solution {
public:vector<int> postorderTraversal(TreeNode* root) {vector<int> v;stack<TreeNode*> st;TreeNode* cur = root;TreeNode* last = nullptr;while(cur || !st.empty()){while(cur){st.push(cur);cur = cur->left;}TreeNode* top = st.top();if(top->right == nullptr || last == top->right){st.pop();last = top;v.push_back(top->val);}else{cur = top->right;}} return v;}
};

这是ac代码

新手写博客,有不对的位置希望大佬们能够指出,也谢谢大家能看到这里,让我们一起学习进步吧!

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

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

相关文章

自编码器(Autoencoder, AE)

自编码器(Autoencoder, AE)是一种无监督学习算法,它利用神经网络来学习数据的高效表示(即编码)。自编码器的目标是能够通过输入数据学习到一个压缩的、分布式的表示,然后通过这种表示重构出原始数据。自编码器主要由两部分组成:编码器(Encoder)和解码器(Decoder)。 …

测试岗最好用的——十大软件测试工具

前言 目前由于软件测试工作在软件的生产过程中越来越重要&#xff0c;很多软件测试工具应运而生&#xff0c;这里介绍一下目前最流行的一些软件测试工具&#xff0c;一个十个&#xff0c;介绍如下&#xff1a;一、企业级自动化测试工具WinRunner 这款软件是Mercury Interacti…

【Linux】 yum —— Linux 的软件包管理器

Linux 的软件包管理器 yum yum 是什么什么是软件包查看软件包 yum 命令行工具yum 配置文件yum 凭什么可以支持下载呢&#xff1f;yum 生态yum 社区yum 的故障排除和资源支持yum 的持续集成和持续交付 yum 是什么 Yum&#xff08;Yellowdog Updater Modified&#xff09;是一个…

【PCIe】TLP结构与配置空间

&#x1f525;博客主页&#xff1a;PannLZ 文章目录 PCIe TLP结构PCIe配置空间和地址空间 PCIe TLP结构 TLP 主要由3个部分组成&#xff1a; Header 、 数据(可选&#xff0c;取决于具体的TLP 类 型 ) 和 ECRC (End to End CRC, 可选)。TLP 都始于发送端的事务层&#xff0c;终…

html 如何引入 百度地图

要在网页中创建和初始化一个地图&#xff0c;通常需要经过以下几个步骤&#xff1a;获取API密钥&#xff08;Access key 百度地图开放平台自行注册获取&#xff09;、加载API脚本、编写HTML、编写JS代码。 下面代码自行测试 html <!DOCTYPE html> <html> <he…

物联网,智慧城市的数字化转型引擎

随着科技的飞速发展&#xff0c;物联网&#xff08;IoT&#xff09;已成为推动智慧城市建设的关键力量。物联网技术通过连接各种设备和系统&#xff0c;实现数据的实时采集、传输和处理&#xff0c;为城市的智能化管理提供了强大的支持。在数字化转型的浪潮中&#xff0c;物联网…

【操作系统概念】 第8章:内存管理

文章目录 0.前言8.1 背景8.1.1 基本硬件8.1.2 地址绑定8.1.3 逻辑地址空间和物理地址空间8.1.4 动态加载&#xff08;dynamic loading&#xff09;8.1.5 动态链接&#xff08;dynamically linking&#xff09;与共享库 8.3 连续内存分配&#xff08;contiguous memory allocati…

【linuxC语言】dup、dup2函数

文章目录 前言一、dup函数二、dup2函数三、将标准输出重定向到文件总结 前言 在Linux环境下&#xff0c;dup、dup2以及原子操作都是用于文件描述符管理和处理的重要工具。这些功能提供了对文件描述符进行复制和原子操作的能力&#xff0c;使得在多线程或多进程环境中更加安全和…

10大主流压力/负载/性能测试工具推荐

在移动应用和Web服务正式发布之前&#xff0c;除了进行必要的功能测试和安全测试&#xff0c;为了保证互联网产品的服务交付质量&#xff0c;往往还需要做压力/负载/性能测试。然而很多传统企业在试水互联网的过程中&#xff0c;往往由于资源或产品迭代速度等原因忽视了这一块工…

整屋案例丨福州府108m²3室2厅2卫轻奢有度,高级耐看。福州中宅装饰,福州装修

空间之间的空间 比空间本身更具有意味&#xff0c; 但也容易被忽略&#xff0c; 正是由于“之间”的多元性和复杂性 以及它的不确定性&#xff0c; 空间之间变得无限可能。 平面设计图 项目信息 项目名称 | 福州府 设计地址 | 福建福州 项目面积 | 108㎡ 项目户型 | …

【JavaEE初阶】 JVM类加载简介

文章目录 &#x1f343;前言&#x1f332;类加载过程&#x1f6a9;加载&#x1f6a9;验证&#x1f6a9;准备&#x1f6a9;解析&#x1f6a9;初始化 &#x1f384;双亲委派模型&#x1f6a9;什么是双亲委派模型&#xff1f;&#x1f6a9;双亲委派模型的优点 ⭕总结 &#x1f343…

程序运行的基本流程

操作系统&#xff08;应用程序&#xff09;&#xff1a; 装系统就是将操作系统安装到硬盘1中 计算机启动的基本过程&#xff1a; 总结&#xff1a; 程序一般保存在硬盘中&#xff0c;软件安装的过程就是将程序写入硬盘的过程程序在运行时会加载进入内存&#xff0c;然后由CPU…

Alveo U200 和 U250 数据中心加速器卡硬件原理图

U200原理图中的一些重要组件和接口如下&#xff1a; QSFP (Quad Small Form-factor Pluggable)&#xff1a;QSFP 是一种高速网络连接器&#xff0c;可支持 40GbE/100GbE 等数据传输速率。在 U200 中&#xff0c;QSFP 用于与外部设备进行高速网络通信。 闪存&#xff1a;闪存是…

kl散度查看

Kullback-Leibler(KL)散度介绍 - 知乎 Kullback-Leibler Divergence Explained — Count Bayesie

【Python】6. 基础语法(4) -- 列表+元组+字典篇

列表和元组 列表是什么, 元组是什么 编程中, 经常需要使用变量, 来保存/表示数据. 如果代码中需要表示的数据个数比较少, 我们直接创建多个变量即可. num1 10 num2 20 num3 30 ......但是有的时候, 代码中需要表示的数据特别多, 甚至也不知道要表示多少个数据. 这个时候,…

重磅发布|AutoMQ 1.0.0 GA 版本官宣:已验证生产环境可用性

AutoMQ 是基于云构建的无服务、极速弹性、极具成本效益的下一代 Kafka。100%兼容Apache Kafka&#xff0c;无分区数据复制。在无副作用的前提下解决了 Kafka 弹性、运维上的诸多痛点并且带来了数量级的成本降低。 AutoMQ 1.0.0 GA 版本现已在 Github 仓库 (https://github.com…

tcp服务器客户端通信(socket编程)

目录 1.编程流程 2.代码演示 2.1 服务器代码 2.2 客户端代码 3.注意 3.1 ping命令 3.2 netstat命令 3.3 为什么memset? 3.4 哪个会阻塞? 3.5 显示连接信息 1.编程流程 2.代码演示 2.1 服务器代码 #include <stdio.h> #include <stdlib.h> #include <…

Logseq电脑端+安卓端同步gitee或github

文章目录 0.初衷1.电脑端1.1 新建仓库1.2 克隆项目&#xff0c;生成秘钥1.3 添加图谱&#xff0c;选择文件目录&#xff0c;我是原本就有笔记&#xff0c;所以会如下所示。1.4 下载脚本文件1.5赋权限 &#xff08;windows可跳过&#xff09;1.6 修改脚本命令1.7 logseq设置同步…

Docker-完整项目的部署(保姆级教学)

目录 1 手动部署(白雪版) 1.1 创建网络 1.2 MySQL的部署 1.2.1 准备 1.2.2 部署 1.3 Java项目的部署 1.3.1 准备 1.3.1.1 将Java项目打成jar包 1.3.1.2 编写Dockerfile文件 1.3.2 部署 1.3.2.1 将jar包、Dockerfile文件放在linux同一个文件夹下 1.3.2.2 构建镜像 …

C# 用Trace.WriteLine输出调试信息无法查看

写程序就会遇见BUG&#xff0c;这时候在代码不同部位输出一些标记的信息对查找错误非常有必要&#xff0c;一般情况下我们都是使用Console.WriteLine()方法来打印信息到控制台窗口&#xff0c;但有时候使用Console.WriteLine()方法会存在不方便的情况&#xff0c;比如鄙人遇到的…