实验三 二叉树

合集下载

数据结构实验报告3-二叉树

数据结构实验报告3-二叉树

北京物资学院信息学院实验报告课程名数据结构(C++)实验实验名称二叉树算法的实现实验日期年月日实验报告日期年月日姓名______ ___ 班级_____ _______ 学号___一、实验目的1.掌握二叉树的存储的结构;2. 掌握建立二叉树的算法;3. 掌握对二叉树的遍历算法;4. 掌握二叉搜索树的算法;5. 掌握建立哈夫曼树和哈夫曼编码的算法;二、实验内容基本部分1. 采用广义表形式建立二叉树(参考图5-11(a)和/或图5-13(a));2. 对已建立的二叉树,进行先、中、后序和按层遍历;3. 用广义表形式输出二叉树;4. 【习题5-3】1, 2 (2题选作)【提示:参考递归遍历算法】;特殊二叉树部分1.用插入算法建立一棵二叉搜索树,原始数据为:{30,50,20,40,25,70,54,23,80,92},并中序遍历该树、查找其中的元素;2. 构造一棵叶子结点权值分别为3,5,6,7,9,13,21的哈夫曼树;3. 对2题进行哈夫曼编码。

三、实验地点与环境3.1 实验地点(南实验楼教室)3.2实验环境(所用语言环境)四、实验步骤1.2.3.…五、实验结果与分析5.1 实验结果(原始数据,预期结果和运行结果)序号算法名称(函数名) 所在头文件名原始数据与与功能主函数所在文件名运行结果*1 函数名:功能:头文件:CPP文件:原始数据:运行结果:23* 如果不能按“原始数据”、“运行结果”列出数据则不列,必要时在“分析”部分说明5.2 分析(选择部分算法分析,包括函数参数说明、调试中所遇到的问题和解决方法、中间结果等,必要时给出函数和主函数的关键段落。

所选算法应是:重要的算法、有编程特点的算法等)六、小结(收获与心得)。

实验三 二叉树

实验三  二叉树

实验三二叉树
一、实验目的
1.掌握二叉树的链式存储结构及其相关操作的实现。

2.掌握二叉树的先序、中序、后序的递归遍历算法。

3.理解二叉树的各种非递归遍历算法的实现。

二、实验要求
1.实验前做好充分准备,包括复习第六章所学内容,事先预习好本次实验内容。

2.实验时记录实验结果,按要求完成各题。

3.实验结束后,给出实验总结与分析并及时给出本次实验的实验报告。

三、实验题目
本次实验给出的选定题目如下表所示。

说明:
(1)实验内容1)为必做内容。

(2)实验内容2)与实验内容3)为选做内容。

四、实验内容与要求
1、实验题目一:(1)二叉树的创建、递归遍历及其它基本操作的实现。

要求:定义用二叉链表表示的二叉树,并实现二叉树的创建、遍历(先序、中序后序)的递归算法及求深度操作等,并对其进行验证。

2、实验题目二:二叉树非递归遍历算法的实现
要求:在题目一的基础上,实现二叉树的非递归遍历算法(先序、中序、后序或按层),并对其进行验证。

3、实验题目三:哈夫曼树及哈夫曼编码的算法实现
要求:编程实现哈夫曼树的创建及利用哈夫曼树求解哈夫曼编码。

实验三--二叉树的基本运算

实验三--二叉树的基本运算

实验三二叉树的基本运算一、实验目的1、使学生熟练掌握二叉树的逻辑结构和存储结构。

2、熟练掌握二叉树的各种遍历算法。

二、实验内容1、问题描述建立一棵二叉树,试编程实现二叉树的如下基本操作:(1). 按先序序列构造一棵二叉链表表示的二叉树T;(2). 对这棵二叉树进行遍历:先序、中序、后序以及层次遍历,分别输出结点的遍历序列;(3). 求二叉树的深度/结点数目/叶结点数目;(选做)(4). 将二叉树每个结点的左右子树交换位置。

(选做)2、基本要求从键盘接受输入(先序),以二叉链表作为存储结构,建立二叉树(以先序来建立)。

3、测试数据如输入:abc00de0g00f000(其中ф表示空格字符)则输出结果为:先序:a->b->c->d->e->g->f中序:a->b->c->d->e->g->f后序:a->b->c->d->e->g->f三、程序代码#include<malloc.h>#include<iostream.h>#define OK 1#define ERROR -1typedef char TElemType;int i;typedef struct BiTNode{TElemType data;struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;int CreateBiTree(BiTree&T) //创建二叉树{char a;cin>>a;if(a=='0') T=NULL;else{if(!(T=(BiTNode*)malloc(sizeof(BiTNode)))) {return ERROR;}T->data=a;CreateBiTree(T->lchild);CreateBiTree(T->rchild);}return OK;}int PreOrderTraverse(BiTree&T) //先序遍历二叉树{if(T){//cout<<"此为先序遍历"<<endl;cout<<T->data<<"->";if(PreOrderTraverse(T->lchild))if(PreOrderTraverse(T->rchild))return OK;return ERROR;}else return OK;}int InOrderTraverse(BiTree&T) //中序遍历二叉树{if(T){//cout<<"此为中序遍历"<<endl;if(InOrderTraverse(T->lchild)){cout<<T->data<<"->";if(InOrderTraverse(T->rchild))return OK;}return ERROR;}else return OK;}int PostOrderTraverse(BiTree&T) //后序遍历二叉树{if(T){//cout<<"此为后序遍历"<<endl;if (PostOrderTraverse(T->lchild))if(PostOrderTraverse(T->rchild)){cout<<T->data<<"->";i++;return (OK);}return (ERROR);}elsereturn (OK);}int CountDepth(BiTree&T) //计算二叉树的深度{if(T==NULL){return 0;}else{int depl=CountDepth(T->lchild);int depr=CountDepth(T->lchild);if(depl>depr){return depl+1;}else{return depr+1;}}}void main() //主函数{BiTree T;cout<<"请输入二叉树节点的值以创建树"<<endl;CreateBiTree(T);cout<<"此为先序遍历";PreOrderTraverse(T);cout<<"end"<<endl;cout<<"此为中序遍历";InOrderTraverse(T);cout<<"end"<<endl;cout<<"此为后序遍历";PostOrderTraverse(T);cout<<"end"<<endl<<"此树节点数是"<<i<<endl<<"此树深度是"<<CountDepth(T)<<endl;}四、调试结果及运行界面:五、实验心得通过这次程序上机实验让我认识到了以前还不太了解的二叉树的性质和作用,这次实验的的确确的加深了我对它的理解。

数据结构实验3二叉树

数据结构实验3二叉树
return0;
}
else
{
Q->front=(Q->front+1)%MAXSIZE;
*x=Q->data[Q->front];
return1;
}
}
voiddestory_seqqueue(Pseqqueue*Q)
{
if(*Q)
free(*Q);
*Q=NULL;
}
voidPreOrder(BTreet)
一、 实验目的
1. 进一步掌握指针变量的含义。
2. 掌握二叉树的结构特征,以及各种存储结构的特点及使用范围。
3. 掌握用指针类型描述、访问和处理二叉树的运算。
二、 实验要求
1. 认真阅读和掌握本实验的参考程序。
2. 按照对二叉树的操作需要,在创建好二叉树后再通过遍历算法验证创建结果。
3. 保存程序的运行结果,并结合程序进行分析。
}SeqStack,*PSeqStack;
PSeqStackInit(void)
{
PSeqStackS;
S=((PSeqStack)malloc(sizeof(SeqStack)));
if(S)
{
S->top=-1;
returnS;
}
}
intEmpty(PSeqStackS)
{
if(S->top==-1)
{
inth1,h2;
if(t==NULL) return 0;
else
{
h1=Height(t->lchild);
h2=Height(t->rchild);
if(h1>h2) return h1+1;

数据结构实验三实验报告

数据结构实验三实验报告

数据结构实验三实验报告数据结构实验三实验报告一、实验目的本次实验的目的是通过实践掌握树的基本操作和应用。

具体来说,我们需要实现一个树的数据结构,并对其进行插入、删除、查找等操作,同时还需要实现树的遍历算法,包括先序、中序和后序遍历。

二、实验原理树是一种非线性的数据结构,由结点和边组成。

树的每个结点都可以有多个子结点,但是每个结点只有一个父结点,除了根结点外。

树的基本操作包括插入、删除和查找。

在本次实验中,我们采用二叉树作为实现树的数据结构。

二叉树是一种特殊的树,每个结点最多只有两个子结点。

根据二叉树的特点,我们可以使用递归的方式实现树的插入、删除和查找操作。

三、实验过程1. 实现树的数据结构首先,我们需要定义树的结点类,包括结点值、左子结点和右子结点。

然后,我们可以定义树的类,包括根结点和相应的操作方法,如插入、删除和查找。

2. 实现插入操作插入操作是将一个新的结点添加到树中的过程。

我们可以通过递归的方式实现插入操作。

具体来说,如果要插入的值小于当前结点的值,则将其插入到左子树中;如果要插入的值大于当前结点的值,则将其插入到右子树中。

如果当前结点为空,则将新的结点作为当前结点。

3. 实现删除操作删除操作是将指定的结点从树中移除的过程。

我们同样可以通过递归的方式实现删除操作。

具体来说,如果要删除的值小于当前结点的值,则在左子树中继续查找;如果要删除的值大于当前结点的值,则在右子树中继续查找。

如果要删除的值等于当前结点的值,则有三种情况:- 当前结点没有子结点:直接将当前结点置为空。

- 当前结点只有一个子结点:将当前结点的子结点替代当前结点。

- 当前结点有两个子结点:找到当前结点右子树中的最小值,将其替代当前结点,并在右子树中删除该最小值。

4. 实现查找操作查找操作是在树中寻找指定值的过程。

同样可以通过递归的方式实现查找操作。

具体来说,如果要查找的值小于当前结点的值,则在左子树中继续查找;如果要查找的值大于当前结点的值,则在右子树中继续查找。

二叉树的建立和遍历的实验报告doc

二叉树的建立和遍历的实验报告doc

二叉树的建立和遍历的实验报告篇一:二叉树的建立及遍历实验报告实验三:二叉树的建立及遍历【实验目的】(1)掌握利用先序序列建立二叉树的二叉链表的过程。

(2)掌握二叉树的先序、中序和后序遍历算法。

【实验内容】1. 编写程序,实现二叉树的建立,并实现先序、中序和后序遍历。

如:输入先序序列abc###de###,则建立如下图所示的二叉树。

并显示其先序序列为:abcde中序序列为:cbaed后序序列为:cbeda【实验步骤】1.打开VC++。

2.建立工程:点File->New,选Project标签,在列表中选Win32 Console Application,再在右边的框里为工程起好名字,选好路径,点OK->finish。

至此工程建立完毕。

3.创建源文件或头文件:点File->New,选File标签,在列表里选C++ Source File。

给文件起好名字,选好路径,点OK。

至此一个源文件就被添加到了你刚创建的工程之中。

4.写好代码5.编译->链接->调试#include#include#define OK 1#define OVERFLOW -2typedef int Status;typedef char TElemType;typedef struct BiTNode{TElemType data;struct BiTNode *lchild, *rchild;}BiTNode,*BiTree;Status CreateBiTree(BiTree &T){TElemType ch;scanf("%c",&ch);if (ch=='#')T= NULL;else{if (!(T = (BiTNode *)malloc(sizeof(BiTNode))))return OVERFLOW;T->data = ch; CreateBiTree(T->lchild); CreateBiTree(T->rchild); }return OK;} // CreateBiTreevoid PreOrder(BiTree T) {if(T){printf("%c",T->data); PreOrder(T->lchild); PreOrder(T->rchild);}}void InOrder(BiTree T) {if(T){InOrder(T->lchild);printf("%c",T->data);InOrder(T->rchild);}}void PostOrder(BiTree T){if(T){PostOrder(T->lchild); PostOrder(T->rchild);printf("%c",T->data);}}void main(){BiTree T;CreateBiTree(T);printf("\n先序遍历序列:"); PreOrder(T);printf("\n中序遍历序列:"); InOrder(T);printf("\n后序遍历序列:"); PostOrder(T);}【实验心得】这次实验主要是通过先序序列建立二叉树,和二叉树的先序、中序、后续遍历算法。

数据结构实验3:二叉树的操作

TextFile中。

(4) P:打印代码文件(Print)。

将文件CodeFile以紧凑格式显示在终端上,每行50个代码。

同时将此字符形式的编码文件写入文件CodePrin中。

(5) T:打印哈夫曼树(Tree printing)。

将已在内存中的哈夫曼树以直观的方式显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。

3) 实现提示:(1) 文件CodeFile的基类型可以设为字节型。

(2) 用户界面可以设计为“菜单”方式:显示上述功能符号,再加上“Q”,表示退出运行Quit。

请用户键入一个选择功能符。

此功能执行完毕后再显示此菜单,直至某次用户选择了“E”为止。

(3) 在程序的一次执行过程中,第一次执行I、D或C命令之后,哈夫曼树已经在内存了,不必再读入。

每次执行中不一定执行I命令,因为文件hfmTree可能早已建好。

三、实验过程与实验结果实验3-01:以二叉链表为存储结构,实现二叉树的创建、遍历数据结构定义:typedef struct BiTNode{char data;BiTNode *lchild, *rchild;}BiTNode;typedef BiTNode *BiTree;算法设计思路简介:本实验需要实现以下操作:二叉树的初始化、前中后序遍历等基本操作1.利用递归实现前后序遍历,思路简洁,仅需要调整递归体的执行顺序即可实现。

2.利用非递归实现中序遍历,需要利用栈操作,按照中序遍历规则将节点依次入栈后出栈实现。

算法描述:图1 中序遍历(非递归)实现算法的实现和测试结果(参考OJ)实验3-02:编写算法交换二叉树中所有结点的左、右子树数据结构定义:typedef struct BiTNode{char data;BiTNode *lchild, *rchild;}BiTNode;typedef BiTNode *BiTree;算法设计思路简介:本实验需要实现以下操作:二叉树的初始化、前中后序遍历等基本操作1.利用递归实现前后序遍历,思路简洁,仅需要调整递归体的执行顺序即可实现。

数据结构实验三——二叉树基本操作及运算实验报告

《数据结构与数据库》实验报告实验题目二叉树的基本操作及运算一、需要分析问题描述:实现二叉树(包括二叉排序树)的建立,并实现先序、中序、后序和按层次遍历,计算叶子结点数、树的深度、树的宽度,求树的非空子孙结点个数、度为2的结点数目、度为2的结点数目,以及二叉树常用运算。

问题分析:二叉树树型结构是一类重要的非线性数据结构,对它的熟练掌握是学习数据结构的基本要求。

由于二叉树的定义本身就是一种递归定义,所以二叉树的一些基本操作也可采用递归调用的方法。

处理本问题,我觉得应该:1、建立二叉树;2、通过递归方法来遍历(先序、中序和后序)二叉树;3、通过队列应用来实现对二叉树的层次遍历;4、借用递归方法对二叉树进行一些基本操作,如:求叶子数、树的深度宽度等;5、运用广义表对二叉树进行广义表形式的打印。

算法规定:输入形式:为了方便操作,规定二叉树的元素类型都为字符型,允许各种字符类型的输入,没有元素的结点以空格输入表示,并且本实验是以先序顺序输入的。

输出形式:通过先序、中序和后序遍历的方法对树的各字符型元素进行遍历打印,再以广义表形式进行打印。

对二叉树的一些运算结果以整型输出。

程序功能:实现对二叉树的先序、中序和后序遍历,层次遍历。

计算叶子结点数、树的深度、树的宽度,求树的非空子孙结点个数、度为2的结点数目、度为2的结点数目。

对二叉树的某个元素进行查找,对二叉树的某个结点进行删除。

测试数据:输入一:ABC□□DE□G□□F□□□(以□表示空格),查找5,删除E预测结果:先序遍历ABCDEGF中序遍历CBEGDFA后序遍历CGEFDBA层次遍历ABCDEFG广义表打印A(B(C,D(E(,G),F)))叶子数3 深度5 宽度2 非空子孙数6 度为2的数目2 度为1的数目2查找5,成功,查找的元素为E删除E后,以广义表形式打印A(B(C,D(,F)))输入二:ABD□□EH□□□CF□G□□□(以□表示空格),查找10,删除B预测结果:先序遍历ABDEHCFG中序遍历DBHEAGFC后序遍历DHEBGFCA层次遍历ABCDEFHG广义表打印A(B(D,E(H)),C(F(,G)))叶子数3 深度4 宽度3 非空子孙数7 度为2的数目2 度为1的数目3查找10,失败。

实验三二叉树的基本操作

实验三二叉树的基本运算一、实验目的1、使学生熟练掌握二叉树的逻辑结构和存储结构。

2、熟练掌握二叉树的各种遍历算法。

二、实验内容题目一:二叉树的基本操作实现(必做题)[ 问题描述]建立一棵二叉树,试编程实现二叉树的如下基本操作:1. 按先序序列构造一棵二叉链表表示的二叉树T;2. 对这棵二叉树进行遍历:先序、中序、后序以及层次遍历,分别输出结点的遍历序列;3. 求二叉树的深度/结点数目/叶结点数目;(选做)4. 将二叉树每个结点的左右子树交换位置。

(选做)[ 基本要求]从键盘接受输入(先序),以二叉链表作为存储结构,建立二叉树(以先序来建立),[ 测试数据]如输入:AB($巾D邱毋巾F巾巾巾(其中巾表示空格字符)则输出结果为先序:ABCDEGF中序:CBEGDFA后序:CGEFDBA层序:ABCDEFG[ 选作内容]采用非递归算法实现二叉树遍历三、算法设计1、 主要思想:根据二叉树的图形结构创建出二叉树的数据结构, 用指针对树进行操作,重点掌握二叉树的结构和性质。

2、 本程序包含四个模块:然后 (1)结构体定义(2) 创建二叉树(3) 对树的几个操作(4) 主函数四、调试分析这是一个比较简单程序,调试过程中并没有出现什么问题,思路比较清晰五、实验结果六、总结此次上机实验对二叉树进行了以一次实际操作,让我对二叉树 有了更深的了解,对二叉树的特性有了更熟悉的认知,让我知道了二叉树的重要性和便利性,这对以后的编程有更好的帮助。

七、源程序#in clude <iostream>#in clude <queue>using namespacestd;#defi ne TElemType char#defi ne Status int#defi ne OK1#defi ne ERRORtypedef struct BiTNode{TEIemTypedata;struct BiTNode * Ichild, *rchild;} BiTNode,* BiTree ;Status CreateBiTree( BiTree &T) {TElemTypech;cin >> ch;if (ch == '#')T = NULLelse{if (!( T = ( BiTNode *)malloc( sizeof (BiTNode))))exit( OVERFLOW「>data = ch;CreateBiTree( T->lchild);CreateBiTree( T->rchild);}return OKStatus PreOrderTraverse( BiTree T){if ( T){cout << T->data;if (PreOrderTraverse( T->lchild))if (PreOrderTraverse( T->rchild))return OKreturn ERRQR}elsereturn OK}Status InOrderTraverse( BiTree T){if ( T) In OrderTraverse( T->lchild); cout << T->data;In OrderTraverse( T->rchild);}return OK}Status PostOrderTraverse( BiTree T){if ( T){PostOrderTraverse( T->lchild);PostOrderTraverse( T->rchild); cout << T->data;}return OK}Status leOrderTraverse( BiTree T){std:: queuevBiTree > Q;if ( T == NULI) return ERRQRelse {Q.push( T);while (!Q.empty()){T = Q.fron t();Q.pop();NULI) cout << T->data;if ( T->lchild != NULLQ.push(T->lchild);if ( T->rchild != NULLQ.push( T->rchild);}}return OK}Status change( BiTree T){BiTree temp = NULLif ( T->lchild == NULL&& T->rchild ==return OKelse {temp = T->lchild;T->lchild = T->rchild;T->rchild = temp;if ( T->lchild)cha nge(「>lchild);if ( T->rchild)cha nge(「>rchild);return OK}:rchilddeep + 1; int FindTreeDeep( BiTree T){int deep = 0;if ( T){int lchilddeep = FindTreeDeep( T->lchild);int rchilddeep = FindTreeDeep( T->rchild);deep = lchilddeep >= rchilddeep ? lchilddeep + 1 }return deep;}int main(){BiTree T;CreateBiTree(T);cout << "先序遍历顺序为:";PreOrderTraverse(T);cout << en dl;cout << "中序遍历顺序为:”;InO rderTraverse(T);cout << en dl;cout << "后序遍历顺序为:”;PostOrderTraverse(T);cout << en dl;cout << "层序遍历顺序为:";leOrderTraverse(T);cout << en dl;cout << "二叉树深度为:"<< Fi ndTreeDeep(T)«e ndl;cout << "左右子树交换后:";cha nge(T);cout << "先序遍历顺序为:";PreOrderTraverse(T); |cout << en dl;return 0;}。

二叉树基本操作--实验报告

⼆叉树基本操作--实验报告实验三⼆叉树的基本操作学院:物理与电⼦学院班级:电信1105班姓名:刘岩学号:29⼀、实验⽬的1、熟悉⼆叉树的基本操作,掌握⼆叉树的实现以及实际应⽤。

3、加深对于⼆叉树的理解,逐步培养解决实际问题的编程能⼒。

⼆、实验环境1台WINDOWS环境的PC机,装有Visual C++ 。

三、实验内容1、问题描述现需要编写⼀套⼆叉树的操作函数,以便⽤户能够⽅便的利⽤这些函数来实现⾃⼰的应⽤。

其中操作函数包括:1>创建⼆叉树CreateBTNode(*b,*str):根据⼆叉树括号表⽰法的字符串*str⽣成对应的链式存储结构。

2>输出⼆叉树DispBTNode(*b):以括号表⽰法输出⼀棵⼆叉树。

3>查找结点FindNode(*b,x):在⼆叉树b中寻找data域值为x的结点,并返回指向该结点的指针。

4>求⾼度BTNodeDepth(*b):求⼆叉树b的⾼度。

若⼆叉树为空,则其⾼度为0;否则,其⾼度等于左⼦树与右⼦树中的最⼤⾼度加l。

5>求⼆叉树的结点个数NodesCount(BTNode *b)6>先序遍历的递归算法:void PreOrder(BTNode *b)7>中序遍历的递归算法:void InOrder(BTNode *b)8>后序遍历递归算法:void PostOrder(BTNode *b)9>层次遍历算法void LevelOrder(BTNode *b)2、基本要求实现以上9个函数。

主函数中实现以下功能:创建下图中的树b输出⼆叉树b找到’H’节点,输出其左右孩⼦值输出b的⾼度输出b的节点个数输出b的四种遍历顺序3、程序编写上图转化为⼆叉树括号表⽰法为A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))程序:#include <>#include <>#define MaxSize 100typedef char ElemType;typedef struct node{ElemType data; /*数据元素*/struct node *lchild; /*指向左孩⼦*/struct node *rchild; /*指向右孩⼦*/} BTNode;void CreateBTNode(BTNode *&b,char *str);//创建BTNode *FindNode(BTNode *b,ElemType x);//查找节点int BTNodeHeight(BTNode *b);//求⾼度void DispBTNode(BTNode *b);//输出int NodesCount(BTNode *b);//⼆叉树的结点个数void PreOrder(BTNode *b);//先序遍历递归void InOrder(BTNode *b);//中序遍历递归void PostOrder(BTNode *b);//后序遍历递归void LevelOrder(BTNode *b);//层次遍历//创建void CreateBTNode(BTNode *&b,char *str){BTNode *St[MaxSize],*p=NULL;int top=-1,k,j=0;char ch;b=NULL;ch=str[j];while(ch!='\0'){switch(ch){case '(':top++;St[top]=p;k=1;break;case ')':top--;break;case ',':k=2;break;default:p=(BTNode *)malloc(sizeof(BTNode)); p->data=ch;p->lchild=p->rchild=NULL;if(b==NULL)b=p;else{switch(k){case 1:St[top]->lchild=p;break;case 2:St[top]->rchild=p;break;}}}j++;ch=str[j];}}//输出void DispBTNode(BTNode *b){if(b!=NULL){printf("%c",b->data);if(b->lchild!=NULL||b->rchild!=NULL){printf("(");DispBTNode(b->lchild);if(b->rchild!=NULL)printf(",");DispBTNode(b->rchild);printf(")");}}}//查找节点BTNode *FindNode(BTNode *b,ElemType x){ BTNode *p;if(b==NULL)return b;else if(b->data==x)return b;else{p=FindNode(b->lchild,x);if(p!=NULL)return p;elsereturn FindNode(b->rchild,x);}}//求⾼度int BTNodeHeight(BTNode *b){int lchildh,rchildh;if(b==NULL)return (0);else{lchildh=BTNodeHeight(b->lchild);rchildh=BTNodeHeight(b->rchild);return(lchildh>rchildh)(lchildh+1):(rchildh+1);}}//⼆叉树的结点个数int NodesCount(BTNode *b){if(b==NULL)return 0;elsereturn NodesCount(b->lchild)+NodesCount(b->rchild)+1; }//先序遍历递归void PreOrder(BTNode *b){ if(b!=NULL){printf("%c",b->data); PreOrder(b->lchild); PreOrder(b->rchild);}}//中序遍历递归void InOrder(BTNode *b){if(b!=NULL){InOrder(b->lchild);printf("%c",b->data); InOrder(b->rchild);}}//后序遍历递归void PostOrder(BTNode *b){ if(b!=NULL){PostOrder(b->lchild); PostOrder(b->rchild);printf("%c",b->data);}}//层次遍历void LevelOrder(BTNode *b){ BTNode *p;BTNode *qu[MaxSize];int front,rear;front=rear=-1;rear++;qu[rear]=b;while(front!=rear){front=(front+1)%MaxSize;p=qu[front];printf("%c",p->data);if(p->lchild!=NULL){rear=(rear+1)%MaxSize;qu[rear]=p->lchild;}if(p->rchild!=NULL){rear=(rear+1)%MaxSize;qu[rear]=p->rchild;}}}void main(){BTNode *b,*p,*lp,*rp;char str[]="A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))";//根据树形图改写成的//⼆叉树括号表⽰法的字符串*str //char str[100];scanf("%s",&str);//⾃⾏输⼊括号表⽰的⼆叉树CreateBTNode(b,str); //创建树bprintf("\n");printf("输出⼆叉树:");//输出⼆叉树bDispBTNode(b);printf("\n");printf("'H'结点:");//找到'H'节点,输出其左右孩⼦值p=FindNode(b,'H');printf("\n");if (p!=NULL){printf("左孩⼦节点的值");printf("%c",p->lchild->data);printf("\n");printf("右孩⼦节点的值");printf("%c",p->rchild->data);printf("\n");//此处输出p的左右孩⼦节点的值}printf("\n");printf("⼆叉树b的深度:%d\n",BTNodeHeight(b));//输出b的⾼度printf("⼆叉树b的结点个数:%d\n",NodesCount(b));//输出b的节点个数printf("\n");printf(" 先序遍历序列:\n");//输出b的四种遍历顺序printf(" 算法:");PreOrder(b);printf("\n");printf(" 中序遍历序列:\n");printf(" 算法:");InOrder(b);printf("\n");printf(" 后序遍历序列:\n");printf(" 算法:");PostOrder(b);printf("\n");printf(" 层次遍历序列:\n");printf(" 算法:");LevelOrder(b); printf("\n");}四、实验⼼得与⼩结通过本次实验,我熟悉⼆叉树的基本知识内容,对课本的知识有了更加深刻的理解与掌握掌握。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include<stdio.h>#include<stdlib.h>#define MAX100typedef char BiTElemType;typedef enum PointerTag{Link,Thread};typedef struct Bitree{BiTElemType data;struct Bitree*Lchild;struct Bitree*Rchild;}BiTNode,*BiTree;typedef struct BiThrNode{BiTElemType data;struct BiThrNode*Lchild;struct BiThrNode*Rchild;PointerTag rTog,lTog;}BiThrNode,*BiThrTree;BiThrTree pre;/*按照中序创建一个线索二叉树*/bool CreatBiThrTree(BiThrTree&T){BiTElemType ch;ch=getchar();if(ch=='#')T=NULL;else{T=(BiThrTree)malloc(sizeof(BiThrNode));if(!T)return false;CreatBiThrTree(T->Lchild);//构造左子树T->data=ch;//生成根结点T->rTog=Link;T->lTog=Link;CreatBiThrTree(T->Rchild);//构造右子树}return true;}/*按照中序将二叉树进行线索化*/void InThreading(BiThrTree p){if(p){InThreading(p->Lchild);if(!p->Lchild){p->lTog=Thread;p->Lchild=pre;}if(!pre->Rchild){pre->rTog=Thread;pre->Rchild=p;}pre=p;InThreading(p->Rchild);}}/*按照中序将一个线索二叉树线索化*/bool InOrderTreading(BiThrTree&Thrt,BiThrTree T){if(!(Thrt=(BiThrTree)malloc(sizeof(BiThrNode))))return false;Thrt->lTog=Link;Thrt->rTog=Thread;Thrt->Rchild=Thrt;if(!T)Thrt->Lchild=Thrt;else{Thrt->Lchild=T;pre=Thrt;InThreading(T);pre->Rchild=Thrt;pre->rTog=Thread;Thrt->Rchild=pre;}return true;}/*按照中序对线索二叉树进行遍历*/bool InOrederTraverse_Thr(BiThrTree T){BiThrTree p=T->Lchild;while(p!=T){while(p->lTog==Link)p=p->Lchild;printf(" %d | %c | %d ",p->lTog,p->data,p->rTog);while(p->rTog==Thread&&p->Rchild!=T){p=p->Rchild;printf(" %d | %c | %d ",p->lTog,p->data,p->rTog);}p=p->Rchild;}printf("\n");return true;}/*按照先序的方法输入二叉树中结点的值,空格表示空树*/ bool CreatBiTree(BiTree&root){BiTElemType ch;ch=getchar();if(ch=='#')root=NULL;else{root=(BiTree)malloc(sizeof(BiTNode));if(!root)return false;root->data=ch;//生成根结点CreatBiTree(root->Lchild);//构造左子树CreatBiTree(root->Rchild);//构造右子树}return true;}/*二叉链先序遍历*/bool DLRBiTree(BiTree root){if(!root)return false;if(root){printf(" %c ",root->data);DLRBiTree(root->Lchild);DLRBiTree(root->Rchild);}return true;}/*二叉链中序遍历*/bool LDRBiTree(BiTree root){if(!root)return false;if(root){LDRBiTree(root->Lchild);printf(" %c ",root->data);LDRBiTree(root->Rchild);}return true;}/*二叉链后序遍历*/bool LRDBiTree(BiTree root){if(!root)return false;if(root){LRDBiTree(root->Lchild);LRDBiTree(root->Rchild);printf(" %c ",root->data);}return true;}/*统计二叉链中度为1的结点个数m,2的结点个数n,0的结点个数 e*/bool StatisticsBiTree(BiTree&root,int&one,int&two,int&zero){if(!root)return false;else{if(root->Lchild&&root->Rchild)two++;if((root->Lchild&&!root->Rchild)||(!root->Lchild&&root->Rchild))one++;if(!root->Lchild&&!root->Rchild)zero++;StatisticsBiTree(root->Lchild,one,two,zero);StatisticsBiTree(root->Rchild,one,two,zero);}return true;}/*计算当前二叉链中的深度/层数*/int GetBiTreeDeepth(BiTree&root){int left=0,right=0;if(root!=NULL){left=0;if(root->Lchild!=NULL){left+=GetBiTreeDeepth(root->Lchild);}right=0;if(root->Rchild!=NULL){right+=GetBiTreeDeepth(root->Rchild);}return(left<right?right:left)+1;}else return0;}/*层序输出二叉树*/void ArrangementOrderTraverse(BiTree&t){BiTree p,queue[MAX];int front=-1,rear=0;queue[rear]=t;while(front!=rear){front=(front+1)%MAX;p=queue[front];printf(" %c ",p->data);if(p->Lchild!=NULL){rear=(rear+1)%MAX;queue[rear]=p->Lchild;}if(p->Rchild!=NULL){rear=(rear+1)%MAX;queue[rear]=p->Rchild;}}}/*计算给定值e所在当前树中的层数num*/bool GetBiTree_e(BiTree&root,BiTElemType e,int num,bool&mark){if(!root){num+=0;return false;}else{if(root->data==e){printf("元素%c 所在层数为%d\n",e,num);mark=true;return true;}GetBiTree_e(root->Lchild,e,num+1,mark);GetBiTree_e(root->Rchild,e,num+1,mark);}return true;}/*菜单*/void mean(){printf("******************实验三二叉树的相关操作*************************\n");printf("** **\n");printf("** 1、创建一个二叉树 2、对二叉树进行四种遍历 **\n");printf("** 3、统计当前二叉树的深度 4、创建一个线索二叉树 **\n");printf("** 5、对线索二叉树进行中序遍历 **\n");printf("** 6、统计二叉链中度为1,2,0的结点个数 **\n");printf("** 7、计算给定值所在二叉树中的层数 0、退出 **\n");printf("******************************************************************\n"); }int main(){BiThrTree Thrt;BiTree root;int choose=100;while(choose!=0){mean();scanf("%d",&choose);getchar();switch(choose){case1:printf("按照先序的方式输入二叉树当结点为空用#表示\n");if(CreatBiTree(root))printf("创建成功\n");elseprintf("创建失败\n");break;case2:if(root!=NULL){printf("先序:");DLRBiTree(root);printf("\n");printf("中序:");LDRBiTree(root);printf("\n");printf("后序:");LRDBiTree(root);printf("\n");printf("层序: ");ArrangementOrderTraverse(root);printf("\n");}elseprintf("当前树为创建请创建之后在进行遍历\n");break;case3:if(root!=NULL){printf("当前树的深度为:%d\n",GetBiTreeDeepth(root));}elseprintf("当前树未创建\n");case4:printf("按照先序的方式输入线索二叉树当结点为空用#表示\n");if(CreatBiThrTree(Thrt)&&InOrderTreading(Thrt,Thrt))printf("创建成功\n");elseprintf("创建失败\n");break;case5:if(Thrt!=NULL){printf("中序:");InOrederTraverse_Thr(Thrt);printf("\n");}break;case6:if(root!=NULL){int one=0,two=0,zero=0;StatisticsBiTree(root,one,two,zero);printf("统计二叉链中度为1的结点个数%d,2的结点个数%d,0的结点个数 %d\n",one,two,zero);}elseprintf("当前树未创建\n");break;case7:if(root!=NULL){BiTElemType e;bool mark=false;printf("请输入你需要查找的元素的值:\n");e=getchar();int num=1;GetBiTree_e(root,e,num,mark);if(!mark)printf("您所需要查询的结点不存在当前树中\n");}elseprintf("当前树未创建\n");case0:printf("正在退出。

相关文档
最新文档