算法与数据结构实验报告——树及其应用
数据结构与算法实验报告 二叉排序树
实验报告
InOrderTraverse(T);
printf("\n\n");
DeleteBST(&T, 93);
printf("删除结点 93 后的结果为:\n");
InOrderTraverse(T);
printf("\n\n");
printf("插入 91 后的结果为:\n");
InsertBST(&T, 91);
InOrderTraverse(T);
printf("\n\n");
return 0;
}
实验心得:
通过本次实验,我理解了二叉排序树的概念,掌握实现算法。同时在二叉排序树的删除操作的代码编写时,让我明白了不同情况的不同处理方式,养成了更严谨的编写代码的思维方式。
数据结构与算法实验报告
数据结构与算法实验报告
实验题目:树的遍历及其应用
实验目的:
1.理解并掌握树的相关概念和定义。
2.掌握树的三种遍历方式:前序遍历、中序遍历和后序遍历。
3.掌握树的深度优先(DFS)和广度优先(BFS)算法。
实验仪器:
1.计算机
2.C/C++编译器
实验原理:
树是一种非常常见的数据结构,它由节点(结点)和边构成,其中一个节点作为根节点,其他节点分布在该根节点下形成分层结构。树有许多重要的应用,如文件系统、数据库索引等。
树的遍历指的是按照其中一种规定的顺序依次访问树中的所有节点。常见的遍历方式有:前序遍历、中序遍历和后序遍历。
前序遍历(Pre-order Traversal):递归地按照“根左右”的顺序遍历树。
中序遍历(In-order Traversal):递归地按照“左根右”的顺序遍历树。
后序遍历(Post-order Traversal):递归地按照“左右根”的顺序
遍历树。
深度优先(Depth First Search,DFS)是一种遍历图或树的算法,
它从起始节点开始,以深度优先的方式依次访问与该节点直接相邻的节点,直到无法再继续访问为止,然后返回到上一个节点,继续访问其他未被访
问的节点。
广度优先(Breadth First Search,BFS)是一种遍历图或树的算法,它从起始节点开始,按照“先访问相邻节点,再访问相邻节点的相邻节点”的顺序进行遍历,直到无法再继续访问为止。
实验内容:
1.实现树的前序遍历、中序遍历和后序遍历算法,可以使用递归或非
递归方式实现。
2.实现树的深度优先(DFS)和广度优先(BFS)算法,可以使用递归
实验2 树型数据结构及其应用
淮海工学院计算机工程学院实验报告书
课程名:《数据结构》
题目:树形数据结构及其应用
班级:
姓名:
实验2树形数据结构
实验目的和要求
1.熟练掌握二叉树的二叉链表存储结构;二叉树的常用遍历方法:按层遍历、先序递归遍历、中序递归和非递归遍历、后序递归遍历。
2.掌握按先序遍历顺序输入数据,递归建立二叉树的方法。
3. 掌握建立哈夫曼树的方法,实现哈夫曼编码。
实验环境
Turbo C 或VC++
实验学时
4学时,必做实验
实验题目
1.[问题描述] 建立一棵用二叉链表方式存储的二叉树,并对其进行遍历(先序、中
序和后序),打印输出遍历结果。
[基本要求] 从键盘接受输入先序序列,以二叉链表作为存储结构,建立二叉树(以先序来建立)并对其进行遍历(先序、中序、后序),然后将遍历结果打印输出。要求采用递归和非递归两种方法实现。
[测试数据] ABCффDEфGффFффф(其中ф表示空格字符)
输出结果为:先序:ABCDEGF
中序:CBEGDFA
后序:CGBFDBA
2.已知二叉树按照二叉链表方式存储,编写算法,要求实现二叉树的竖向显示(竖向显示就是二叉树的按层显示)。
[提示]:
(1)参习题6.20,实现逐层遍历
(2)队中保存每个结点的打印位置,其左、右子的距离
3.如题1要求建立好二叉树,按凹入表形式打印二叉树结构,如图6.34所示。
A
B C
D E
图6.34
F
主要数据结构
1.
typedef char DataType;
typedef struct Node
{
DataType data;
struct Node *LChild;
树的应用算法与数据结构
《算法与数据结构》实验报告
(一) 实验题目:树的应用
1、实验目的:
(1)针对问题的实际要求,正确应用树形结构组织和存储数据;
(2)掌握二叉树的存储方法。
(3)掌握二叉树的各种遍历方法。
2、实验内容: 二叉树后序遍历的非递归算法。
3、实验说明:
二叉树后序遍历的非递归算法:结点要入两次栈,出两次栈;为了区别
同一个结点的两次出栈,设置标志flag ,当结点进、出栈时,其标志flag 也同
时进、出栈。
设根指针为root ,则可能有以下两种情况:
⑴ 若root!=NULL ,则root 及标志flag (置为1)入栈,遍历其左子树;
⑵ 若root=NULL ,此时若栈空,则整个遍历结束;若栈不空,则表明栈
顶结点的左子树或右子树已遍历完毕。若栈顶结点的标志flag=1,则表明
栈顶结点的左子树已遍历完毕,将flag 修改为2,并遍历栈顶结点的右子
树;若栈顶结点的标志flag=2,则表明栈顶结点的右子树也遍历完毕,输
出栈顶结点。
二叉树后序遍历的非递归算法伪代码如下:
设计分析
在后序遍历中,在输出一个结点之前,要两次经历该结点。第一次是从该结点出发沿其左孩子指针遍历其左子树,第二次是沿其右孩子指针遍历其右子树。只有右子树遍历完成之后,才能访问该结点。因此,一个结点要分两次进栈,只有第二次出栈时,才能访问该结点。也就是说,在后序遍历中要区分是从左子树返回还是从右子树返回,在结点入栈时,必须同时压入一个标记,用该标记指明返回的情况。所以基本思路
1 第一次出栈,只遍历完左子树,该结点不能访问
2 第二次出栈,遍历完右子树,该结点可以访问 flag = 1. 栈s 初始化; 2. 循环直到root 为空且栈s 为空 2.1 当root 非空时循环 2.1.1将root 连同标志flag=1入栈; 2.1.2 继续遍历root 的左子树; 2.2 当栈s 非空且栈顶元素的标志为2时,出栈并输出栈顶结点; 2.
算法与数据结构实验报告实验五
算法与数据结构实验报告
实验五
实验名称:二叉树的应用
姓名:卢丽娟
学号:211006289
专业:软件工程
班级:二班
指导教师:陈亦萍
日期: 2012年5月19日
一、实验目的
该实验是验证二叉树的二叉链表表示,实现CreateBiTree算法创建二叉树。
二、实验内容与实验步骤
利用CreateBiTree算法创建二叉树,实现二叉树的先序、中序、后序递归遍历算法中的一种,编写主程序调用CreateBiTree创建二叉树,并调用先(中、后)序遍历算法,测试不同的输入数据创建二叉树,预期输出并验证输出的结果。
步骤:
1.创建二叉树
BiTree CreateBiTree(BiTree &T)//二叉树的创建
{//按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树,构造二叉链表表示的二叉树T
char ch;scanf(" %c",&ch);//%c前加1空格,留给回车
if(ch=='#') T=NULL; //空格字符表示空树
else
{ if(!(T=(BiTNode*)malloc(sizeof(BiTNode)))) exit(-1);
T->data=ch;//生成根节点
CreateBiTree(T->lchild);//构造左子树
CreateBiTree(T->rchild);//构造右子树}return T;}//CreateBiTree
2.父亲结点的输出
int visit(char e)
{ printf("%c",e);return 1;}
3.中序遍历
void InorderTraverse(BiTree T)
数据结构树的应用
数据结构树的应用
数据结构树的应用
数据结构是计算机科学中重要的一个分支,而树是其中一种重要且实用的数据结构之一。树是由一个根节点和若干子节点组成的一种非线性数据结构,被广泛应用于计算机领域中,特别是在算法设计和数据处理方面。下面我们将详细介绍树的应用领域。
1. 数据库
在数据库管理系统中,树被广泛应用于索引结构。数据库中的查找过程可以转化为在树中查找某个节点的过程。常用的树结构包括B-树、B+树和红黑树,这些结构可以高效的处理大量数据,支持高效的检索和排序。
2. 文件系统
操作系统中的文件系统其实就是一种树形结构。目录和文件被视为节点,而目录之间的关系和文件之间的关系则是树的关系。基于树形结构的文件系统使得我们可以很方便地在系统中查找和管理文件。
3. 编程语言
树形结构被广泛运用于编程语言中。AST(抽象语法树)就是一种常见的语法分析树,它将程序中的语句和表达式抽象成一个树形结构,在编译器中被广泛使用,可以很方便地实现代码的词法分析、语义分析和优化。此外,树也可以用于构建运行时数据结构,如二叉搜索树、
Trie树、AVL树等等。
4. 网络
在计算机网络中,树的结构被广泛应用于路由器和交换机中。这些设
备需要通过识别和分析网络中的数据包,将它们分配到不同的路由或
交换机上进行处理。树的结构使得这些设备可以很方便地对不同的数
据包进行分类、处理和转发。
5. 人工智能
在人工智能中,树也是非常重要的一种数据结构。决策树是常用的机
器学习算法之一,它通过一系列的二叉树形结构对数据进行分类和判断。在处理自然语言、语音识别和图像处理等领域中,树结构也被广
《数据结构与算法设计》第5章 树
5.3.2 二叉树的链式存储结构
5.3.2 二叉树的链式存储结构
➢ 三叉链表表示法
在二叉链表的节点中增加一个双亲指针域(parent),由该 类节点构成的二叉树的存储结构称为三叉链表。
三叉链表节点结构
5.3.2 二叉树的链式存储结构
5.3.3 二叉树的二叉链表类模板定义
➢ 节点类模板和二叉链表类模板的声明
5.2.2 二叉树的性质
➢ 满二叉树和完全二叉树
满二叉树是指深度为h且节点数取得最大值2h-1的二叉树。 如果一棵深度为h的二叉树,除第h层外,其他每层的节点数 都达到最大,且最后一层的节点自左而右连续分布,这样的二 叉树称为完全二叉树。
5.2.2 二叉树的性质
5.2.2 二叉树的性质
性质6 对含有n个节点的完全二叉树自上而下、同一层从左往右 对节点编号0,1,2,…,n-1,则节点之间存在以下关系: (1)若i=0,则节点i是根节点,无双亲;若i>0,则其双亲节 点的编号为i/2-1; (2)若2×i +1≤n,则i的左孩子编号为2×i+1; (3)若2×i+2≤n,则i的右孩子编号为2×i+2; (4)若i>1且为偶数,则节点i是其双亲的右孩子,且有编号为 i-1的左兄弟; (5)若i<n-1且为奇数,则节点i是其双亲的左孩子,且有编号 为i+1的右兄弟。
数据结构实验报告——树
2008级数据结构实验报告
实验名称:实验三树
学生姓名:
班级:
班内序号:
学号:
日期:2009年11月23日
1.实验要求
a. 实验目的
通过选择两个题目之一进行实现,掌握如下内容:
掌握二叉树基本操作的实现方法
了解赫夫曼树的思想和相关概念
学习使用二叉树解决实际问题的能力
b. 实验内容
利用二叉树结构实现赫夫曼编/解码器。
基本要求:
1、初始化(Init):能够对输入的任意长度的字符串s进行统计,统计每个
字符的频度,并建立赫夫曼树
2、建立编码表(CreateTable):利用已经建好的赫夫曼树进行编码,并将每
个字符的编码输出。
3、编码(Encoding):根据编码表对输入的字符串进行编码,并将编码后的
字符串输出。
4、译码(Decoding):利用已经建好的赫夫曼树对编码后的字符串进行译
码,并输出译码结果。
5、打印(Print):以直观的方式打印赫夫曼树(选作)
6、计算输入的字符串编码前和编码后的长度,并进行分析,讨论赫夫曼
编码的压缩效果。
2. 程序分析2.1 存储结构
存储结构:
二叉树
示意图如下:
2.2 关键算法分析
核心算法思想:
1.哈夫曼编码(Huffman Coding)是可变字长编码。编码时借助哈夫曼树,也即带权路径长
度最小的二叉树,来建立编码。
2.哈夫曼编码可以实现无损数据压缩。单个字符用一个特定长度的位序列替代:在字符串
中出现频率高的符号,使用短的位序列,而那些很少出现的符号,则用较长的位序列。关键算法思想描述和实现:
关键算法1:
统计字符出现的频度,记录出现的字符及其权值,对未出现的字符不予统计编码。将统计的叶子节点编制成数组。为创建哈夫曼树作准备。
数据结构-树的实现实验报告
初始条件:树T存在,p指向T中某个结点,1≤i≤p指结点的度+1,非空树c与T不相交。
操作结果:插入c为T中p指结点的第i棵子树。
DeleteChild(&T,&p,i);
初始条件:树T存在,p指向T中某个结点,1≤i≤p指结点的度。
操作结果:删除T中p所指结点的第i棵子树。
int InitQueue (LinkQueue &Q)
{
if(!(Q.front=Q.rear=new QNode))
exit(OVERFLOW);
Q.front->next=NULL;
return OK;
}
/*销毁队列Q*/
int DestBaidu NhomakorabeaoyQueue(LinkQueue &Q)
{
while(Q.front){
const char NIL=' ';
/*****************树的二叉链表孩子-兄弟-双亲存储表示***************************/
typedef struct CSnode
{
char data;
CSnode *firstchild,*nextsibling,*parent;
层次序遍历树:W-A-B-D-X-E-Y-Z
数据结构-树的简单实现实验报告
计算机科学与技术系
实验报告
专业名称计算机科学与技术
课程名称《数据结构》
项目名称树的创建和实现
班级
学号
姓名
同组人员无
实验日期
一、实验目的与要求:
(简述本次实验要求达到的目的,涉及到的相关知识点,实验的具体要求。)(一)实验目的:
应用树来实现对数据的操作
(二)实验要求:
用树实现对数据的排序。
(三)实验环境:
VC++6.0.
二、实验内容
#include
#include
#define maxsize 10
//#define NULL 0
typedef struct node{
char data;
struct node *lchild, *rchild;
}Bitree;
Bitree *Q[maxsize];
Bitree *creatree(){
char ch;
int front, rear;
Bitree *T, *s;
T = NULL;
front = 1; rear = 0;
ch = getchar();
while(ch !='#')
{
s =NULL;
if(ch != '@')
{
s= (Bitree*)malloc(sizeof(Bitree));
s->data = ch;
s->lchild = s->rchild = NULL;
}
rear++;
Q[rear] = s;
if(rear == 1)
T = s;
else
{
if(s!=NULL && Q[front] != NULL)
if(rear % 2 == 0)
Q[front] ->lchild = s;
else
Q[front] ->rchild = s;
数据结构实验报告-树(二叉树)
实验5:树(二叉树)(采用二叉链表存储)
一、实验项目名称
二叉树及其应用
二、实验目的
熟悉二叉树的存储结构的特性以及二叉树的基本操作。
三、实验基本原理
之前我们都是学习的线性结构,这次我们就开始学习非线性结构——树。线性结构中结点间具有唯一前驱、唯一后继关系,而非线性结构中结点的前驱、后继的关系并不具有唯一性。在树结构中,节点间关系是前驱唯一而后继不唯一,即结点之间是一对多的关系。直观地看,树结构是具有分支关系的结构(其分叉、分层的特征类似于自然界中的树)。
四、主要仪器设备及耗材
Window 11、Dev-C++5.11
五、实验步骤
1.导入库和预定义
2.创建二叉树
3.前序遍历
4.中序遍历
5.后序遍历
6.总结点数
7.叶子节点数
8.树的深度
9.树根到叶子的最长路径
10.交换所有节点的左右子女
11.顺序存储
12.显示顺序存储
13.测试函数和主函数
对二叉树的每一个操作写测试函数,然后在主函数用while+switch-case的方式实现一个带菜单的简易测试程序,代码见“实验完整代码”。
实验完整代码:
#include <bits/stdc++.h>
using namespace std;
#define MAX_TREE_SIZE 100
typedef char ElemType;
ElemType SqBiTree[MAX_TREE_SIZE];
struct BiTNode
{
ElemType data;
BiTNode *l,*r;
}*T;
void createBiTree(BiTNode *&T)
树的应用算法与数据结构
树的应用算法与数据结构
二叉树(Binary Tree)是一种树形数据结构,其具有以下特性:
1.每个节点最多只能有两个子节点,即左右子树;
2.每个节点只有一个父节点,根节点除外;
3.每个节点的左右子树也都是二叉树。
二叉树广泛应用在各种算法和数据结构中,由于其结构简单,操作方便,空间复杂度低,故被称为“天然数据结构”。本文将介绍常见的二叉树应用算法和数据结构,针对其应用算法和数据结构的优点也一并进行介绍。
一、二叉树应用算法
1.二叉树:
二叉树(Binary Search Tree,BST)是指一棵空树或者具有以下性质的二叉树:若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值;若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值。二叉树的特性可以大大提高查找操作的效率,它是一种用于实现排序操作的非常有效的方法。
2.平衡二叉树:
平衡二叉树(AVL Tree)是指一棵空树或者具有以下性质的二叉树:任意节点的两棵子树的深度相差不能超过1,即本质上每个节点的左右子树深度相差不能超过1、它使得二叉树性能得到优化,改进了二叉树在插入或删除操作时可能出现的不平衡问题。
3.红黑树:
算法与数据结构实验报告——树及其应用
北京邮电大学软件学院
2019-2020学年第1学期实验报告
课程名称:算法与数据结构课程设计
实验名称:树及其应用
实验完成人:
日期: 2019 年 11月 10 日
一、实验目的
树是一种应用极为广泛的数据结构,也是这门课程的重点。它们的特点在于非线性。
广义表本质上是树结构。本章实验继续突出了数据结构加操作的程序设计观点,但根据这两种结构的非线性特点,将操作进一步集中在遍历操作上,因为遍历操作是其他众多操作的基础。遍历逻辑的(或符号形式的)结构,访问动作可是任何操作。
本次实验希望帮助学生熟悉各种存储结构的特征,以及如何应用树结构解决具体问题(即原理与应用的结合)。
二、实验内容
必做内容
1)二叉树的建立与遍历
[问题描述]
建立一棵二叉树,并对其进行遍历(先序、中序、后序),打印输出遍历结果。
[基本要求]
从键盘接受输入(先序),以二叉链表作为存储结构,建立二叉树(以先序来建立),并采用递归算法对其进行遍历(先序、中序、后序),将遍历结果打印输出。
[测试数据]
ABCффDEфGффFффф(其中ф表示空格字符)则输出结果为
先序:ABCDEGF
中序:CBEGDFA
后序:CGBFDBA
2)打印二叉树结构
[问题描述]
按凹入表形式横向打印二叉树结构,即二叉树的根在屏幕的最左边,二叉树的左子树在屏幕的下边,二叉树的右子树在屏幕的上边。例如:
[测试数据]
由学生依据软件工程的测试技术自己确定。注意测试边界数据,如空二叉树。
[实现提示]
(1)利用RDL遍历方法;
(2)利用结点的深度控制横向位置。
选做内容
采用非递归算法实现二叉树遍历。
树形结构及应用 实验报告
实验报告
课程名称:数据结构与算法课程类型:必修
实验项目名称:
实验题目:树形结构及应用
一、实验目的
树型结构的建立与遍历树型结构的遍历是树型结构算法的基础,本实验要求编写程序演示二叉树的存储结构的建立和遍历过程。
二、实验要求及实验环境
实验要求:
(1)编写建立二叉树的二叉链表存储结构的程序,并横版和竖版两种方式显示该二
叉树;
(2) 在(1)所建二叉树的基础上,编写程序完成先序、中序和后序遍历的递归和非
递归实现并显示相应的遍历序列;
(3) 在二叉树的二叉链表存储结构基础上,编写程序实现二叉树的先序或中序或后
序线索链表存储结构建立的算法,并(用广义表的形式)显示和保存二叉树的相应
的线索链表;
中序线索链表广义表显示示例:1(2(4(0,2), 1), 3(6(1,3),7(3,0)))
(4) 在二叉树的线索链表存储结构上,编写程序分别实现求一个结点的先序(中序、
后序)的后继结点的算法;(先序、中序、后序可以任选一种实现)
(5) 在 (4) 基础上,编写程序实现对线索二叉树进行先序(中序、后序)遍历的
非递归算法,并显示线索二叉树和相应的遍历序列。
实验环境:运行C或c++的微机。
三、设计思想(本程序中的用到的所有数据类型的定义,主程序的流程图及各程序模块之间的调用关系)
1.逻辑设计
2.物理设计
1.二叉树数据类型:
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
2.线索二叉树数据类型:
typedef struct BiThreTree{
数据结构——树和森林实验报告
树和森林应用实验
实验报告
实验目的
(1) 掌握树和森林的二叉链表表示方法。
(2) 掌握树和二叉树的结构及算法之间的对应关系。
(3) 掌握树的两种遍历算法及其应用。
实验运行环境
Visual C++
实验任务
为使实验程序简洁直观,下面的部分实验程序中的一些功能实现仍以调用库函数程序"trees.h"中的函数的形式给出,并假设该库函数中定义了树指针和结点类型分别为tree和tn ode,以及部分常用运算,例如构建树(森林)、以某种方式显示树和森林等。各运算的名称较为直观,因而易于理解。读者可自行设计自己的库函数,也可到作者的网站下载。
说明2 :为便于数据的描述,和前面的实验一样,将测试数据结构列出,并以一个文件名的形式给出标注,例如测试数据名为treel.tre的树,其具体结构形式参见附录中的树列表中的标有treel.tre的树。
实验内容
第一题:
<1>将一棵树(或森林)转换为二叉树。
实验测试数据基本要求:
第一组数据:tree1.tre
第二组数据:tree2.tre
实验准备:
用广义表来表示树的数据,保存到文件中,通过文件流来读入数据,并根据读入的数据来创建树
第二题:
<2>求森林的高度。
实验测试数据基本要求:
第一组数据:treel.tre
第二组数据:tree2.tre
第一组数据:full41.cbt
第二组数据:letter.cbt
实验准备:
遍历每一棵树,寻找高度的最大值。可以设立一个私有成员来记录数的高度。
第三题:
<3>按层次方式遍历森林。实验测试数据基本要求:
实验五树结构及其应用
实验五树结构及其应用
本实验根据树结构的非线性特点,将操作集中在遍历操作上,因为遍历操作是其他众多操作的基础。本实验还希望达到使学生熟悉各种存储结构的特征,以及掌握如何应用树解决具体问题(即原理与应用的结合)等目的。
1.二叉树的建立与遍历(验证性实验)
【问题描述】
建立一棵二叉树,并对其进行遍历(先序、中序和后序),打印输出遍历结果。
【基本要求】
从键盘接受输入(先序序列),以二叉链表作为存储结构,建立二叉树(以先序来建立),并采用递归算法对其进行遍历(先序、中序和后序),将遍历结果打印输出。
【测试数据】
ABC##DE#G##F###(其中#表示空),则输出结果为:
先序为ABCDEGF,中序为CBEGDF A,后序为CGBFDBA。
2. 利用二叉树的遍历算法的基本操作(设计性实验)
【问题描述】利用二叉树的遍历算法:
●求二叉树的结点数;
●求二叉树的叶结点数;
●求二叉树的高度。
【基本要求】
(1) 按第1题中的方法建立二叉链表存储的二叉树。
(2) 提供菜单选择计算结点数、叶结点数、高度。
【提示】
●求二叉树的结点数;
⏹1+左子树的结点数+右子树的结点数
●求二叉树的叶结点数;
⏹左子树的叶结点数+右子树的叶结点数
●求二叉树的高度。
⏹1+(左、右子树高度较大的值)
【测试数据】
A
如图中的二叉树,结点数:6个叶结点数:2个高度:4
3.赫夫曼编码(综合性实验)(选做)
【问题描述】
设某编码系统共有n个字符,使用频率分别为w1, w2, …, w n,设计一个不等长的编码方案,使得该编码系统的空间效率最好。
【基本要求】
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
北京邮电大学软件学院
2019-2020学年第1学期实验报告
课程名称:算法与数据结构课程设计
实验名称:树及其应用
实验完成人:
日期: 2019 年 11月 10 日
一、实验目的
树是一种应用极为广泛的数据结构,也是这门课程的重点。它们的特点在于非线性。
广义表本质上是树结构。本章实验继续突出了数据结构加操作的程序设计观点,但根据这两种结构的非线性特点,将操作进一步集中在遍历操作上,因为遍历操作是其他众多操作的基础。遍历逻辑的(或符号形式的)结构,访问动作可是任何操作。
本次实验希望帮助学生熟悉各种存储结构的特征,以及如何应用树结构解决具体问题(即原理与应用的结合)。
二、实验内容
必做内容
1)二叉树的建立与遍历
[问题描述]
建立一棵二叉树,并对其进行遍历(先序、中序、后序),打印输出遍历结果。
[基本要求]
从键盘接受输入(先序),以二叉链表作为存储结构,建立二叉树(以先序来建立),并采用递归算法对其进行遍历(先序、中序、后序),将遍历结果打印输出。
[测试数据]
ABCффDEфGффFффф(其中ф表示空格字符)则输出结果为
先序:ABCDEGF
中序:CBEGDFA
后序:CGBFDBA
2)打印二叉树结构
[问题描述]
按凹入表形式横向打印二叉树结构,即二叉树的根在屏幕的最左边,二叉树的左子树在屏幕的下边,二叉树的右子树在屏幕的上边。例如:
[测试数据]
由学生依据软件工程的测试技术自己确定。注意测试边界数据,如空二叉树。
[实现提示]
(1)利用RDL遍历方法;
(2)利用结点的深度控制横向位置。
选做内容
采用非递归算法实现二叉树遍历。
三、实验环境
Windows下利用vs 2019完成,语言c++
四、实验过程描述
首先构造Tree类,内含树的结构体BiTree,以及本实验所要用到的一些操作
typedef struct BiTNode
{
TElemType data;
int degree, depth, level; //度,高度,高度差
struct BiTNode* lchild, * rchild; /* 左右孩子指针 */
}BiTNode, * BiTree;
实现相应功能:
1、二叉树的建立与遍历
构造二叉树:
前序构造,先赋值,然后递归构造左子树,递归构造右函数
BiTNode* Tree::CreatBiTree(BiTree T) {
TElemType ch;
cin >> noskipws >> ch; //不跳过空格
if (ch == ' ')
T = NULL; //输入空格表示空子树
else {
T = new BiTNode; //分配空间
if(!T) //分配失败就退出
throw new std::bad_alloc;
T->degree = 0; //记录度
(T)->data = ch;
T->depth++; //度增加
T->lchild=CreatBiTree(T->lchild); //递归创建左子树
T->rchild=CreatBiTree(T->rchild); //递归创建右子树
if (T->lchild != NULL)
T->degree++; //有一个孩子度就加一
if (T->rchild != NULL)
T->degree++;
}
return T;
}
销毁二叉树:
后序递归销毁左右子树(需要先查找到子树,销毁再销毁父亲树)
void Tree::Release(BiTree T) {
if (T != NULL) {
Release(T->lchild); //递归销毁左子树
Release(T->rchild); //递归销毁右子树
delete T;
}
}
//前序遍历
void Tree::PreOrderTraverse(BiTree T, void(Tree::*Visit)(BiTree)) { if (T) /* T不空 */
{
(this->*Visit)(T); /* 先访问根结点 */
PreOrderTraverse(T->lchild, Visit); /* 再先序遍历左子树 */
PreOrderTraverse(T->rchild, Visit); /* 最后先序遍历右子树 */ }
}
//中序遍历
void Tree::InOrderTraverse(BiTree T, void(Tree::*Visit)(BiTree)) {
if (T)
{
InOrderTraverse(T->lchild, Visit); /* 先中序遍历左子树 */
(this->*Visit)(T); /* 再访问根结点 */
InOrderTraverse(T->rchild, Visit); /* 最后中序遍历右子树 */ }
}
//后序遍历
void Tree::PostOrderTraverse(BiTree T, void(Tree::*Visit)(BiTree)) {
if (T)
{
PostOrderTraverse(T->lchild, Visit); /* 先中序遍历左子树 */
PostOrderTraverse(T->rchild, Visit); /* 最后中序遍历右子树 */
(this->*Visit)(T); /* 再访问根结点 */
}
}