【C++】二叉树进阶面试题(下)

目录

6. 根据一棵树的前序遍历与中序遍历构造二叉树

题目

分析

代码

7. 根据一棵树的中序遍历与后序遍历构造二叉树

题目

分析

代码

8. 二叉树的前序遍历,非递归迭代实现 

题目

分析

代码

9. 二叉树中序遍历 ,非递归迭代实现

题目

分析

代码

10. 二叉树的后序遍历 ,非递归迭代实现

题目

分析

代码


6. 根据一棵树的前序遍历与中序遍历构造二叉树

题目

OJ链接

分析

前序遍历的第一个结点一定是根节点,根据根结点在中序结点的位置可以划分出根节点的左右结点范围,然后根据递归调用,不断地划分子树的左右结点,代码如下

代码

class Solution {
public:TreeNode* createTree(vector<int>& preorder, vector<int>& inorder,int& cur,int begin,int end){if (begin > end)return nullptr;int root = begin;//寻找根节点在中序遍历的位置while (root <= end){if (preorder[cur] == inorder[root])break;++root;}TreeNode* ret = new TreeNode(preorder[cur++]);ret->left=createTree(preorder, inorder, cur, begin, root-1);ret->right=createTree(preorder, inorder, cur, root+1, end);return ret;}TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {if (preorder.empty() || inorder.empty())return nullptr;int cur=0;int begin = 0;int end = inorder.size() - 1;return createTree(preorder, inorder,cur,begin,end);}
};

7. 根据一棵树的中序遍历与后序遍历构造二叉树

题目

OJ链接

分析

方法跟上一题类似,只是后续遍历的根节点要从最后一位找,并且向前遍历,同时要注意先找右子树再找左子树。

代码

class Solution {
public:TreeNode* createTree(vector<int>& postorder, vector<int>& inorder, int& cur, int begin, int end){if (begin > end)return nullptr;int root = begin;while (root <= end){if (postorder[cur] == inorder[root])break;++root;}TreeNode* ret = new TreeNode(postorder[cur--]);ret->right = createTree(postorder, inorder, cur, root + 1, end);ret->left = createTree(postorder, inorder, cur, begin, root - 1);return ret;}TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {if (postorder.empty() || inorder.empty())return nullptr;int cur = inorder.size() - 1;int begin = 0;int end = cur;return createTree(postorder, inorder, cur, begin, end);}
};

8. 二叉树的前序遍历,非递归迭代实现 

题目

OJ链接

分析

任意一个树我们都可以分为两部分:左路结点和左路结点的右子树,如下图

左路结点的右子树又可以分为新的左路结点和左路结点的右子树

通过这种思路,如下代码所示

代码

class Solution {
public:vector<int> preorderTraversal(TreeNode* root) {vector<int> ans;if (root == nullptr)return ans;TreeNode* cur = root;stack<TreeNode*> st;while (!st.empty()||cur){//插入所有左路结点到栈中while (cur){st.push(cur);ans.push_back(cur->val);cur = cur->left;}//对左路结点进行出栈,并将左路结点的右子树的根作为新的cur结点//下一层循环访问右子树的所有左路结点插入到栈中TreeNode* top = st.top();st.pop();cur = top->right;}return ans;}
};

9. 二叉树中序遍历 ,非递归迭代实现

题目

OJ链接

分析

将上一题的ans.push_back放到下面既可以完成

代码

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

10. 二叉树的后序遍历 ,非递归迭代实现

题目

OJ链接

分析

因为是后序遍历,父亲结点最后插入,所以要判断右结点是否为空或者右结点是上一次访问过的结点

代码

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

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

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

相关文章

RLNNA-DBSCAN聚类

RLNNA-DBSCAN聚类 RLNNA算法&#xff08;基于强化学习的神经网络优化算法&#xff09;是一种性能较佳的优化算法。DBSCAN聚类算法&#xff08;密度聚类算法&#xff09;是一种基于密度的聚类算法&#xff0c;其主要思想是通过寻找样本点周围的密度可达关系来聚类数据。 使用RL…

自动化专家来谈谈Selenium中的时间等待

在 Selenium 中&#xff0c;时间等待指在测试用例中等待某个操作完成或某个事件发生的时间。Selenium 中提供了多种方式来进行时间等待&#xff0c;包括使用 ExpectedConditions 中的 presence_of_element_located 和 visibility_of_element_located 方法等待元素可见或不可见&…

小白如何选择阿里云服务器配置?小白不怕

阿里云服务器配置怎么选择&#xff1f;CPU内存、公网带宽和系统盘怎么选择&#xff1f;个人开发者或中小企业选择轻量应用服务器、ECS经济型e实例&#xff0c;企业用户选择ECS通用算力型u1云服务器、ECS计算型c7、通用型g7云服务器&#xff0c;阿里云服务器网aliyunfuwuqi.com整…

事件流、事件捕获、事件冒泡、事件委托

一、事件流 事件流指的是事件完整执行过程中的流动路径&#xff0c;分为捕获阶段、冒泡阶段。如上图 二、事件捕获 当一个元素的事件被触发时&#xff0c;会从DOM的根元素开始&#xff0c;依次调用同名事件&#xff08;从外到里&#xff0c;从父到子&#xff09;。 DOM.addEve…

基于炬芯ATS283X头戴式蓝牙耳机开发

基于炬芯ATS283X头戴式蓝牙耳机开发 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加他微信hezkz17, 本群提供音频技术答疑服务,+群赠送蓝牙音频,DSP音频项目核心开发资料, 1 电路设计 2 SDK 开发

CryoEM - CryoAI: Amortized Inference of Poses 工程源码复现

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/136384544 Paper: CryoAI: Amortized Inference of Poses for Ab Initio Reconstruction of 3D Molecular Volumes from Real Cryo-EM Images CryoAI: 基于摊…

国产嵌入式DSP教学实验箱_操作教程:22-AD采集DA输出实验(采集输出正弦波)

一、实验目的 掌握EMIFA、SPI的使用&#xff0c;了解AD7606、AD5724的芯片特性和使用&#xff0c;并实现基于AD7606采集、AD5724输出正弦波。 二、实验原理 StarterWare StarterWare是一个免费的软件开发包&#xff0c;它包含了示例应用程序。StarterWare提供了一套完整的G…

代码随想录刷题笔记-Day30

1. 解数独 37. 解数独https://leetcode.cn/problems/sudoku-solver/ 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x…

打动HR的秘密武器:四款在线简历制作网站,让你脱颖而出!

如果你想找到一份好工作&#xff0c;你必须先写一份优秀的工作。在这个人力资源部承认一天要看数百份简历的时代&#xff0c;求职者需要一份优秀的简历才能脱颖而出&#xff0c;获得面试机会。 现实中&#xff0c;很多人往往无法设计出满意的简历&#xff0c;所以他们甚至没有…

人工智能-飞桨

文章目录 概要安装零基础教程基础知识小结 概要 集核心框架、基础模型库、端到端开发套件、丰富的工具组件于一体的深度学习平台 官方入口 安装 python安装 python官方下载 PaddlePaddle安装 python -m pip install paddlepaddle2.6.0 -i https://mirror.baidu.com/pypi/s…

上位机图像处理和嵌入式模块部署(qmacvisual三个特色)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 了解了qmacvisual的配置之后&#xff0c;正常来说&#xff0c;我们需要了解下不同插件的功能是什么。不过我们不用着急&#xff0c;可以继续学习下…

MySQL数据库技术(二)

MySQL数据库技术&#xff08;1X&#xff09; 定义表的时候&#xff0c;需要确定每个字段的数据类型。MySQL 支持多种数据类型&#xff0c; 大致可以分为三类&#xff1a;数值类型、日期/时间类型和字符串类型。 数值类型 数值类型包括 5 种整数、2 种浮点数和 1 种定点数&a…

Java 实现国网698协议,帧头、数据帧校验算法

最近在做电表测试相关软件&#xff0c;开发过程需要学习698协议&#xff0c;网上关于698协议的资料很少。此文记录一下协议中关于帧头和整帧校验码算法&#xff0c;Java代码如下&#xff1a; public class Test {public static void main(String[] args) {//定义一个字节数据用…

跨境电商选品API商品采集API接入指南

选品是每个电商卖家的必经之路&#xff0c;产品的好坏将直接决定店铺的盈利、发展方向。选择合适的产品可以让卖家事半功倍&#xff0c;快速爆单。 用API实现代购系统和1688淘宝等平台的商品信息对接&#xff0c;可以免去很多选品工作。 item_get 获得淘宝商品详情item_get_p…

在vue3中使用el-tree-select做一个树形下拉选择器

el-tree-select是一个含有下拉菜单的树形选择器&#xff0c;结合了 el-tree 和 el-select 两个组件的功能。 因为包含了el-tree的功能&#xff0c;我们可以自定义tree的节点&#xff0c;创造出想要的组件 使用default插槽可以自定义节点内容&#xff0c;它的default插槽相当于…

Day19:信息打点-红蓝队自动化项目资产侦察武器库部署企查产权网络空间

目录 各类红蓝队优秀工具项目集合 自动化-武器库部署-F8x 自动化-网络空间-AsamF 自动化-企查信息-ENScan 自动化-综合架构-ARL&Nemo 思维导图 章节知识点 Web&#xff1a;语言/CMS/中间件/数据库/系统/WAF等 系统&#xff1a;操作系统/端口服务/网络环境/防火墙等 应…

高中数学:单调奇偶综合(较难)

一、奇偶性扩展 1、普通轴对称函数 要会根据抽象函数的关系&#xff0c;找出对称轴 简便记法&#xff1a;纵相等&#xff0c;对称轴 2、普通中心对称函数 要会找出对称中心点坐标 简便记法&#xff1a;纵和定&#xff0c;中心点 二、题型汇总 解题方法 抽象函数 1、…

如果不使用管理器,星露谷如何安装模组

Mac、Linux、安卓系统建议阅读官方WIKI 如果你没有特殊的需求&#xff0c;可以使用小火星露谷管理器一键安装模组 https://smallfire.cn 1. 什么是模组&#xff1f; 扩展或修改游戏的文件。可以改变游戏。功能如下&#xff1a; 扩展游戏内容&#xff0c;比如添加额外的游戏…

C++ 多态的概述

文章目录 1、概念2、引入3、使用基类指针、引用 访问 子类对象中的成员方法&#xff08;虚函数&#xff09;4、基类指针作为函数的参数 函数可以操作该基类派生出的任意子类对象 1、概念 多态是c的特征之一 多态的分类&#xff1a;静态多态&#xff08;静态联编&#xff09;、…

Android Studio开发(二) 常用布局

1、概述 在Android Studio中&#xff0c;布局方式指的是用于定义和排列界面元素&#xff08;如按钮、文本框、图片等&#xff09;的方式。Android应用的界面通常由多个视图组件组成&#xff0c;而布局方式则确定了这些视图组件在屏幕上的位置、大小和相互关系。 适应不同屏幕尺…