【二叉树构建与遍历1】先序遍历+中序遍历构建一个二叉树并输出后序遍历 C++实现

news2024/11/17 9:57:48

思路:

先来一个例子:

先序遍历序列为:FDXEAG

中序遍历序列为:XDEFAG

要根据先序序列和中序序列确定这个二叉树,通用的步骤为:

1.根据先序序列的第一位确定这棵树的根;

2.在中序序列中找到根的所在的位置,根的左边就是该树的左子树的节点,根的右边就是该树的右子树的节点;

3.根据树的左子树节点和右子树节点在先序序列中分别找到对应的子串;

4.对3中找到的两个子串分别重复1 2 3步,左子树节点用于构建左子树,右子树节点用于构建右子树,直到所有的节点都用于构建这棵树。

示例:

根据以上的案例走一遍:

1.由先序遍历序列为:FDXEAG可知,树的根节点为F;

2.在中序遍历序列XDEFAG找到F的索引为3,左边XDE就是该树的左子树的节点,右边AG就是该树的右子树的节点;

3.根据树的左子树节点XDE和右子树节点AG在先序序列中分别找到对应的子串,分别为:DXE和AG;

4.对DXE和AG分别重复步骤1 2 3,DXE用于构建左子树,AG用于构建右子树,直到所有的节点都用于构建树。

每执行完第一轮步骤1 2 3,所用的根节点已经用于构建树了,后续就不用再考虑了。例如,执行完第一轮步骤1 2 3,根节点F已经用过了,后续就不用再考虑了。

分析:

相信思路都很明确,步骤大概也明白了,接下来代码实现中一个非常注重细节的地方就是递归构建左子树和右子树的部分,再详细说就是在递归调用构建树的函数中,我们要传入的两个参数应该怎么确定。

本次主要介绍利用先序遍历序列和中序遍历构建一个二叉树并输出后序遍历的方法,我们在递归调用构建树的函数中,我们要传入的两个参数当然就是子树的先序遍历序列和中序遍历序列。创建左子树时就传入左子树的先序遍历序列和中序遍历序列,创建右子树时就传入右子树的先序遍历序列和中序遍历序列。

以下根据以上案例详细分析:对于:

索         引:012345
先序遍历序列为:FDXEAG

中序遍历序列为:XDEFAG

 

将以上两个遍历序列分别命名为字符串s1,s2,即s1 = "FDXEAG", s2 = "XDEFAG"。根据s1可知树的根为F,在s2中寻找到F的索引(定义为pos)为3。根据s2可得左子树包括的字符有:XDE(由s2.substr(0, pos)获得),右子树包括的字符有:AG(由s2.substr(pos+1)获得),在s1中对应的字符串分别为:DXE(由s1.substr(1, pos)获得)和AG(由s1.substr(pos+1)获得)。根据以上获得的四个参数,可以递归创建左子树和右子树。

源代码:

//根据先序遍历和中序遍历确定一个二叉树
// 二叉树节点结构定义
struct TreeNode {
	char data;
	TreeNode* leftChild;
	TreeNode* rightChild;
	TreeNode(char c): data(c), leftChild(NULL), rightChild(NULL){}
};

// 根据先序遍历和中序遍历构建二叉树
TreeNode* Build(string str1, string str2) {
	if (str1.size() == 0) {
		return NULL;
	}
	// 取先序遍历的第一个字符作为根节点
	char c = str1[0];
	// 在中序遍历中找到根节点的位置
	int pos = str2.find(c);
	// 创建根节点
	TreeNode* root = new TreeNode(c);
	 递归构建左子树
	root->leftChild = Build(str1.substr(1, pos), str2.substr(0, pos));
	 递归构建右子树
	root->rightChild = Build(str1.substr(pos + 1), str2.substr(pos + 1));

	return root;
}

// 后序遍历输出
void postOrder(TreeNode* root) {
	if (root == NULL) {
		return;
	}
	//先遍历左子树
	postOrder(root->leftChild);
	//再遍历右子树
	postOrder(root->rightChild);
	//输出当前根节点的值
	cout << root->data;

	return;
}


int main()
{
	string s1, s2;
	while (getline(cin, s1)) {
		getline(cin, s2);
		TreeNode* root = Build(s1, s2);
		cout << "该树的后序遍历序列为:";
		postOrder(root);
		cout << endl;
	}

	return 0;
}

示例运行结果:

 

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

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

相关文章

LVS之keepalived

1、keepalived 概述 总结&#xff1a;Keepalived 软件就是通过VRRP协议来实现高可用功能。 应用场景&#xff1a;企业应用中&#xff0c;单台服务器承担应用存在单点故障的危险 单点故障一旦发生&#xff0c;企业服务将发生中断&#xff0c;造成极大的危害 VRRP通信原理&…

【CASS精品教程】CAD2016+CASS11.0安装教程(附CASS11.0安装包下载)

文章目录 一、CAD2016_x64安装二、CASS11.0安装1. 安装程序2. 安装补丁3. 安装注册机三、CASS11.0下载地址一、CAD2016_x64安装 CASS11.0.0.8 支持 AutoCAD2010-2023,大家可以根据自己的情况安装对应的版本,本文以CAD2016为例,CAD安装过程略去。 二、CASS11.0安装 点击订…

Pytorch 手写数字识别-MINIST 数据集训练

CNN 前期文章我们分享了tensorflow 的手写数字识别的训练以及识别过程,有网友私信是否写一下pytorch训练识别过程,本期文章我们来分享一下pytorch的手写数字训练人工智能TensorFlow(十六)MNIST手写数字识别 说到图片识别就不得不提卷积神经网络,我们会在后期详细介绍,或者…

docker启动容器失败:STATUS:‘ Exited ‘

先查看正在运行的容器 # 查看正在运行的容器 docker ps # 查看所有的docker容器 docker ps -a 这个时候如果显示的是up状态&#xff0c;那就是启动成功了。 状态为exited&#xff0c;所以没有启动成功。 解决问题 1、移除镜像 先把镜像移除掉 //移除一个镜像(出现问题可以移…

一篇文章看懂前端性能优化(2023详解)

性能优化这个词我们经常会在前端的工作或面试中遇到&#xff0c;这个东西说难好像也并不怎么难&#xff0c;毕竟谁都能说上几点。但是如果你想在工作上遇到各种场景的性能瓶颈时都有直击本质的性能方案&#xff0c;或者在面试时让面试官眼前一亮&#xff0c;那就不能只拘泥于『…

nodejs+vue+elementui大学生就业管理系统hch86

本学生就业管理系统以vue作为框架&#xff0c;b/s模式以及MySql作为后台运行的数据库&#xff0c; 本系统主要包括首页&#xff0c;个人中心&#xff0c;辅导员管理&#xff0c;学生管理&#xff0c;企业管理&#xff0c;工作类型管理&#xff0c;企业招聘管理&#xff0c;投简…

TOWE机房电源线的用料成分及导体材质大揭秘

在IDC数据机房中&#xff0c;各种制式的电源转换线是一个连接设备端与供电端的重要配件产品。平常我们在各大电商平台搜索电源转换线产品&#xff0c;会发现同一种电源线&#xff0c;有卖几十块钱的&#xff0c;也有十块钱不到的。同一产品出现较大价差的现象&#xff0c;最根本…

信息监理工程师-----监理内容

文章目录 信息监理工程师的监理内容1 四控1.1 质量控制1.2 进度控制1.3 投资控制1.4 变更控制 2 三管2.1 信息管理2.2 合同管理2.3 信息安全管理 3 一协调3.1 协调 信息监理工程师的监理内容 监理活动的主要内容被概括为"四控,三管,一协调". 1 四控 四控&#xff…

ES:一次分片设计问题导致的故障

### 现象&#xff1a; 1. 单节点CPU持续高 2.写入骤降 3.线程池队列积压&#xff0c;但没有reject 4.使用方没有记录日志 ### 排查 1.ES监控 只能看到相应的结果指标&#xff0c;无法反应出原因。 2.ES日志&#xff1a;大量日志打印相关异常&#xff08;routate等调用栈&a…

docker安装Oracle11gR2

文章目录 目录 文章目录 前言 一、前期准备 二、具体配置 2.1 配置oracle容器 2.2 配置navicat连接 总结 前言 使用docker模拟oracle环境 一、前期准备 安装好docker #拉取镜像 docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g #启动 docker run -…

书单背景图怎么设置,怎么把书单转成视频?

书单是一种记录阅读内容的方式&#xff0c;它可以让我们更好地跟踪我们的阅读进度并分享我们的阅读心得。有时候你想要将自己的书单转化为视频格式来与更多人分享&#xff0c;但你不知道如何做到这一点。在本文中&#xff0c;我将向你介绍如何设置书单背景图并将书单转成视频。…

操作系统-笔记-第二章-锁

目录 二、第二章——【锁】 1、互斥锁​编辑 2、信号量机制 &#xff08;1&#xff09;信号量机制——整形信号量 &#xff08;2&#xff09;信号量机制——记录信号量 &#xff08;3&#xff09;总结&#xff08;重点——记录信号量&#xff09; 3、信号量机制——实现…

数仓分类及基本概念

【数仓建设系列之二】数仓分类及基本概念 随着移动互联网的快速发展&#xff0c;数据的生产也成几何式的增长&#xff0c;传统意义上的数据库已经无法满足日益增长的需求&#xff0c;建设一个好的数仓&#xff0c;不仅可以为企业的决策和发展带来具有价值的指导意义&#xff0c…

Python自动化测试代理程序可用性

在网络爬虫和数据采集过程中&#xff0c;代理服务器扮演着重要的角色。然而&#xff0c;代理服务器的可用性经常会受到影响&#xff0c;给爬虫工作带来一定的挑战。本文将介绍如何使用Python自动化测试代理程序的可用性&#xff0c;为您提供具备实际操作价值的解决方案。让我们…

同为科技(TOWE)65W快充插排插线板,快人一步,乐享生活

在现代生活中&#xff0c;手机、平板、笔记本电脑等电子设备已成为人们生活中不可或缺的工具。然而&#xff0c;诸多电子产品在充电方面也出现了许多问题&#xff0c;比如充电过程慢、插口不够用、充电时温度过高等。随着随着技术的更新迭代&#xff0c;满足高功率、多接口且多…

机器学习与模式识别2:KNN(k近邻)

一、简介 首先&#xff0c;随机选择K个对象&#xff0c;而且所选择的每个对象都代表一个组的初始均值或初始的组中心值&#xff0c;对剩余的每个对象&#xff0c;根据其与各个组初始均值的距离&#xff0c;将他们分配各最近的&#xff08;最相似&#xff09;小组&#xff0c;然…

Redis原理剖析

一、Redis简介 Redis是一个开源的&#xff0c;基于网络的&#xff0c;高性能的key-value数据库&#xff0c;弥补了memcached这类key-value存储的不足&#xff0c;在部分场合可以对关系数据库起到很好的补充作用&#xff0c;满足实时的高并发需求。 Redis跟memcached类似&#…

会声会影和Pr哪个好?

会声会影是加拿大Corel公司制作的一款功能强大的视频编辑软件&#xff0c;正版英文名&#xff1a;Corel VideoStudio&#xff0c;具有图像抓取和编修功能&#xff0c;可以抓取&#xff0c;转换MV、DV、V8、TV和实时记录抓取画面文件&#xff0c;并提供有超过100 多种的编制功能…

小研究 - Android 字节码动态分析分布式框架(四)

安卓平台是个多进程同时运行的系统&#xff0c;它还缺少合适的动态分析接口。因此&#xff0c;在安卓平台上进行全面的动态分析具有高难度和挑战性。已有的研究大多是针对一些安全问题的分析方法或者框架&#xff0c;无法为实现更加灵活、通用的动态分析工具的开发提供支持。此…

水电站防雷工程综合解决方案

水电站防雷工程是指为了保护水电站的建筑物、设备和人员免受雷电危害而采取的一系列技术措施。水电站防雷工程的主要内容包括接地装置、引下线、接闪器、等电位连接、屏蔽、综合布线和电涌保护器等分项工程。水电站防雷工程的施工和质量验收应遵循国家标准《建筑物防雷工程施工…