数据结构实验--唯一的确定一棵二叉树

2023-11-06

一、问题描述

如果给出了遍历二叉树的前序序列和中序序列,则可以构造出唯一的一棵二叉树。试编写实现上述功能的程序。

【基本要求】
已知一棵二叉树的前序和中序序列,试设计完成下列任务的一个算法:
(1)构造一棵二叉树;
(2)证明构造正确(即分别以前序和中序遍历该树,将得到的结果与给出的序列进行比较)。
(3)对该二叉树进行后序遍历,输出后序遍历序列。
(4)用凹入法输出该二叉树。

【测试数据】
(1)前序序列为ABDEGCFHIJ,中序序列为DBGEAHFIJC。
(2)前序序列为-+abc/de,中序序列为a+bc-d/e 。

【拓展内容】
由原表达式构造二叉树。测试数据(a+b) ×c-d/e

二、需求分析

需要设计有以下几个功能的程序:

  • 1:由已知的前序和后续序列构建二叉树
  • 2:分别用三种序列(前中后)输出二叉树
  • 3:用凹入法输出二叉树

输入:分别输入前序序列和后序序列

输出:四种方法分别输出该二叉树

拓展功能:根据输入的中缀表达式(四则运算),创建二叉树

三、设计

3.1 概要设计

(1)数据结构设计
根据题目要求易知本程序采用树结构作为基本结构,但在操作过程中也要用字符数组或者字符串类型储存计算过程中的表达式,考虑到需要多次使用截取部分字符串的

(2)算法设计
根据前序遍历的特点, 知前序序列(PreS)的首个元素(PreS[0])为二叉树的根(root), 然后在中序序列(InS)中查找此根(root), 根据中序遍历特点, 知在查找到的根(root) 前边的序列为根的左子树的中序遍历序列, 后边的序列为根的右子树的中序遍历序列。 设在中序遍历序列(InS)根前边有left个元素. 则在前序序列(PreS)中, 紧跟着根(root)的left个元素序列(即PreS[1…left]) 为根的左子树的前序遍历序列, 在后边的为根的右子树的前序遍历序列.而构造左子树问题其实跟构造整个二叉树问题一样,只是此时前序序列为PreS[1…left]), 中序序列为InS[0…left-1], 分别为原序列的子串, 构造右子树同样, 显然可以用递归方法解决。

建立完二叉树之后,很容易建立三个函数用递归的算法遍历输出已经建立的二叉树的前中后三种序列,对于凹入法,可以基于前序遍历输出,在输出的时候控制格式,即根据层高判断字符前面输出的空格数,在字符后输出与空格对应的点或其他字符,保持总的字符数不变。
在这里插入图片描述

3.2 详细设计

1.类的设计

由于本算法基于树来实现,首先要设计树的节点类,包括数据域和指针域,指针域包括左子树和右子树。树类包括一个指向树的节点类的指针和其他若干函数

2. 遍历函数设计

void PreOrderTraverse(BiNode* t)
{
	if (t == NULL) return;	
		cout << t->Data;
		PreOrderTraverse(t->L_Child);
		PreOrderTraverse(t->R_Child);
}//前序遍历

遍历的算法如上,基于递归的思想,首先把t等于NULL作为递归出口
输出当前数据之后,依次递归访问左孩子和右孩子
对于中序和后续遍历仅需改变输出语句与访问左右孩子的顺序

3. 创建二叉树函数设计

void CreateBiTree(BiNode* t, string Pres, string Ins)//t为要建立的二叉树,pres和ins分别为前序和中序序列

{
	if (Pres.length() == 0) { t = NULL; return; }//递归出口:当前前序序列长度为零

	//前序序列的第一位Pres[0]即为根
	int Location = Ins.find(Pres[0]);//根在中序序列中的位置,以此位置把中序序列分开
	string L_In = Ins.substr(0, Location);//左孩子的中序序列
	string R_In = Ins.substr(Location + 1);//右孩子的中序序列
	int L_length = L_In.length();//左孩子的长度即左子树节点个数

	//在原前序序列中 按顺序 提取出子树节点个数个字符  当作对应子树新的前序序列
	string L_Pre = Pres.substr(1, L_length);//左孩子的前序序列
	string R_Pre = Pres.substr(1 + L_length);//右孩子的前序序列

	t->Data=Pres[0];//当前前序序列的首位赋给t的data

	if(L_Pre.length()){
	t->L_Child = new BiNode();
	CreateBiTree(t->L_Child, L_Pre, L_In);//递归创建左孩子
	}
	if(R_Pre.length()){
	t->R_Child = new BiNode();
	CreateBiTree(t->R_Child, R_Pre, R_In);//递归创建右孩子
	}
}

创建二叉树的算法如上,表示图如下: 在这里插入图片描述

4.凹入法输出设计

void Concave(BiNode* p, string ss, string RR)
{
	if (p == NULL)   return; //递归出口

	ss += "   ";//用来控制格式,每次多输出三个空格
	RR = RR.substr(3);//用来控制格式,字符后输出特定的符号,并保证最后一位对齐
	cout << ss << p->Data << RR << endl;
	Concave(p->L_Child, ss,RR);
	Concave(p->R_Child, ss,RR);
}

凹入法打印二叉树的算法如上:主函数调用的语句如下
Concave(TreeRoot, “”, “…”);

四、测试数据及测试结果:

测试输入:前序序列为ab,中序序列为ab 。
测试目的:设计该输入的目的在于测试程序在哪方面可能存在漏洞;
实际输出:经检验该输出符合预期的要求在这里插入图片描述

测试输入:前序序列为ABDEGCFHIJ,中序序列为DBGEAHFIJC。
测试目的:设计该输入的目的在于测试程序在哪方面可能存在漏洞;
实际输出:经检验该输出符合预期的要求
在这里插入图片描述

测试输入:前序序列为-+abc/de,中序序列为a+bc-d/e 。
测试目的:设计该输入的目的在于测试程序在哪方面可能存在漏洞;
实际输出:经检验该输出符合预期的要求
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构实验--唯一的确定一棵二叉树 的相关文章

随机推荐

  • python爬虫正则表达式

    博主简介 博主是一个大二学生 主攻人工智能领域研究 感谢缘分让我们在CSDN相遇 博主致力于在这里分享关于人工智能 C python 爬虫等方面的知识分享 如果有需要的小伙伴 可以关注博主 博主会继续更新的 如果有错误之处 大家可以指正 专
  • 蓝桥杯常用模板

    文章目录 蓝桥杯算法模板 最大公约数 GCD 拓展欧几里得 EXGCD 最小公倍数 LCM 多个数的GCD和LCM 判断闰年 整数快速幂 用于快速求幂 快速幂取模 快速乘 O logn 对于一个大数最后结果只需要部分结尾数字 则在过程中取模
  • (十一)javascript内置对象之Math内置对象

    内置对象就是 js 语言自带的一些对象 这些对象可供开发者使用 这些内置对象提供了一些常用的或是最基本而必要的一些功能 内置对象最大的优点是帮助我们快速开发 javascript提供的常用的内置对象有 Math Date Array Str
  • matlab plot 连续曲线,Matlab怎么画出连续的曲线?

    因为你是在for循环中画的 所以循环一次算出一个点 matlab就画一个点 你可以在循环完毕后在使用plot画图 clear all clc i 1 脚标i L1 1 L2 1 L 1 C1 1 C2 1 C 1 m 0 5 w 50 a
  • C++期末复习运算符混淆---打妖怪

    7 2 打妖怪 低级错误 运算符混淆问题 实验1 第二题 话说孙大圣保唐僧西天取经 路上遇到一妖怪 妖怪共有 v 滴血 大圣每打一棒就能使妖怪失去 h 滴血 妖怪一旦没血就会立即死去 大圣打 n 棒刚好将妖怪打死 请编写程序 输入 v 和
  • 代码题: 看代码说结果, 事件循环 + async 函数的

    1 基本的 async await 和事件循环 console log 1 async function asyncFunc console log 2 await Promise resolve console log 3 asyncFu
  • Simulated Binary Crossover(SBX)的学习

    最近在做作业遇到一个Dejong s fifth function的multi modal的问题 用传统的GA方法尝试了很多次 的确没办法搞定 随机很多次也不一定在global optimum的地方得到一次解 前几天去导师家里的路上谈到这个
  • 什么是 MATLAB(矩阵实验室)?工作、功能和应用

    MATLAB 被 MathWorks 定义为专有软件应用程序和编程语言 可促进复杂的数据分析任务 例如算法实施 与其他应用程序交互以及操作数据矩阵 本文介绍了 MATLAB 的用途 其关键概念以及 2022 年的用例 什么是 MATLAB
  • 【解决】TypeError: this.$refs.treeRefs.xxx is not a function

    问题 使用refs触发子组件内方法时报 TypeError this refs treeRefs xxx is not a function 解决 经查看 发现子组件被放在了v for循环体内 示例代码如下
  • 虚拟机上部署K8S集群

    虚拟机上部署K8S集群 安装VM Ware 安装Docker 安装K8S集群 安装kubeadm 使用kubeadm引导集群 安装VM Ware 参考 http www taodudu cc news show 2034573 html a
  • 推荐系统:Wide & Deep模型解析

    1 Wide Deep模型介绍 经典推荐深度模型 Wide Deep 对应的论文 Wide Deep Learning for Recommender Systems 链接 arxiv Wide Deep的模型架构如下图所示 可以看到Wid
  • 运维技能风向标

    运维介绍 运维是一个融合多学科 网络 系统 开发 安全 应用架构 存储等 的综合性技术岗位 从最初的网络管理 网管 发展到现在的系统运维工程师 网络运维工程师 安全运维工程师 运维开发工程师等 可以看出 运维的分工一直在细化 并且对综合技能
  • Element Plus for Vue 3 入门教程

    本文首发 Element Plus for Vue 3 入门教程 Element Plus 有那些升级 Element Plus 与 Element UI 是什么关系 老 Element 项目是否可以平滑升级到 Vue 3 Element
  • 如何快速实现Android平台前端设备接入能力

    技术背景 SIP 会话初始化协议 是在 IP网络上进行多媒体通信的应用层控制协议 以几种RFC的形式提供 其中最重要的是包含核心协议规范的RFC3261 该协议用于创建 修改和终止与一个或多个参与者的会话 通过会话 我们了解了一组进行通信的
  • linux inode满了后,怎么清理

    最近服务器的inode inode介绍 达到了90 当 Ised 节点使用率 达到100 时 即使文件系统有剩余空间也无法写入数据 这里记录下解决方法 清理文件系统下 细碎文件 施放节点数 因为该路径下的文件都是重要文件 不能够删除 所以这
  • 【数据库内核】物理执行器引擎Pull模型之火山模型

    目录 概述 算子介绍 火山模型 火山模型痛点 一 虚函数的开销 二 Cpu Cache的利用率 结论 参考资料 概述 当我们的逻辑计划引擎把SQL生成了逻辑计划后 后端的物理计算引擎接收到逻辑计划生成物理执行计划 便可以开始去真正执行计算作
  • 推荐Android15个常用的图表库,包含线性,条形柱状,饼状图,扇形,雷达,股票,折线,散点,仪表盘......

    1 https github com xcltapestry XCL Charts Android开源图表库 XCL Charts is a free charting library for Android platform XCL Ch
  • fatal error: ros/ros.h: 没有那个文件或目录

    程序包下面的cmakelist txt 加上 find package catkin REQUIRED COMPONENTS roscpp include directories include catkin INCLUDE DIRS
  • Kubernetes系列(一)基础概念

    从最基础开始了解k8s 首先需要清楚三个问题 k8s是怎么出现的 他解决了什么问题 整体架构是什么样的 有哪些优缺点 从以上三个问题出发 本文将分为三个章节 讲述K8S的一些基础概念 发展历程 接触K8S之前 就得先了解一下云计算这个概念
  • 数据结构实验--唯一的确定一棵二叉树

    一 问题描述 如果给出了遍历二叉树的前序序列和中序序列 则可以构造出唯一的一棵二叉树 试编写实现上述功能的程序 基本要求 已知一棵二叉树的前序和中序序列 试设计完成下列任务的一个算法 1 构造一棵二叉树 2 证明构造正确 即分别以前序和中序