陈正宁123349数据结构第3次实验报告.docx
《陈正宁123349数据结构第3次实验报告.docx》由会员分享,可在线阅读,更多相关《陈正宁123349数据结构第3次实验报告.docx(11页珍藏版)》请在冰豆网上搜索。
![陈正宁123349数据结构第3次实验报告.docx](https://file1.bdocx.com/fileroot1/2022-11/24/7cf54286-0bb5-44b8-a99d-234edf1b3e4e/7cf54286-0bb5-44b8-a99d-234edf1b3e4e1.gif)
陈正宁123349数据结构第3次实验报告
淮海工学院计算机科学系
实验报告书
课程名:
《数据结构》
题目:
树型数据结构试验
班级:
软嵌151
学号:
2015123349
姓名:
陈正宁
树结构算法实现与应用报告要求
1目的与要求:
1)熟练掌握二叉树的二叉链表表示及前序创建算法与实现;
2)熟练掌握二叉树的前序、中序和后序递归遍历算法与实现;
3)掌握中序遍历线索二叉树的基本算法与实现
4)掌握中序遍历线索化二叉树的算法与实现;
5)按照实验题目要求独立完成实验内容;
6)认真书写实验报告,并按时提交(本次实验本周5以前提交,不得延误)。
2实验内容或题目
实验内容:
1)按照先序序列建立下图所示二叉树的二插链表树,结点元素类型取字符型,树的字符序列从键盘逐个动态输入。
2)在第1)步建立好的二叉链表树上实施前序、中序和后序递归遍历,并输出相应遍历序列。
3)在第1)步建立好的二叉链表树上实施前序遍历的叶子结点输出及其个数统计。
4)在第1)步建立好的二叉链表树上实施二叉树性质三的验证;
5)在第1)步建立好的二叉链表树上实施中序非递归遍历,并输出相应遍历序列(选做)
6)中序线索化第1)步所建立的二叉链表树(选做)。
7)中序遍历第6)步所建立的线索二叉树,并输出遍历结果(选做)
(程序设计要求注释:
实验要求完成的任务(各个实验内容)应以菜单机制显示和运行来逐项完成,即整个实验题目写一个主程序完成所有实验内容,并以菜单机制实施交互运行,而不要一个实验内容写一个主程序)
3实验步骤与源程序
#include
#include
#include
#include
typedefstructNode
{chardata;
structNode*LChild;
structNode*RChild;
}BiTNode,*BiTree;
voidCreateBiTree(BiTree*bt)
{
charch;
ch=getchar();
if(ch=='.')
*bt=NULL;
else
{
*bt=(BiTree)malloc(sizeof(BiTNode));
(*bt)->data=ch;
CreateBiTree(&((*bt)->LChild));
CreateBiTree(&((*bt)->RChild));
}
}
voidVisit(charch)//打印元素
{
printf("%c",ch);
}
voidPreOrder(BiTreeroot)//先序
{
if(root!
=NULL)
{
Visit(root->data);
PreOrder(root->LChild);
PreOrder(root->RChild);
}
}
voidInOrder(BiTreeroot)//中序
{
if(root!
=NULL)
{
InOrder(root->LChild);
Visit(root->data);
InOrder(root->RChild);
}
}
voidPostOrder(BiTreeroot)//后序
{
if(root!
=NULL)
{
PostOrder(root->LChild);
PostOrder(root->RChild);
Visit(root->data);
}
}
voidPre(BiTreeroot)//打印叶子节点
{
if(root!
=NULL)
{
if(root->LChild==NULL&&root->RChild==NULL)
{
printf("%c",root->data);
}
Pre(root->LChild);
Pre(root->RChild);
}
}
intLeafCount(BiTree&T)//计算叶子结点数
{
intnum1,num2,num3;
if(!
T)return0;
if(T->LChild==NULL&&T->RChild==NULL)
return1;
num1=LeafCount(T->LChild);
num2=LeafCount(T->RChild);
num3=num1+num2;
return(num3);
}
intcountdouble(BiTree&T)//计算度为2的节点数
{
intcount=0;
if(T==NULL||T->LChild==NULL&&T->RChild==NULL)
return0;
else
{
if(T->LChild!
=NULL&&T->RChild!
=NULL)
count++;
returncount+countdouble(T->LChild)+countdouble(T->RChild);
}
}
voidmain()
{
inti;
BiTreeT;
star:
printf("\n/**************************************/\n");
printf("二叉树的创建与遍历程序\n");
printf("1-------创建先序遍历二叉树\n");
printf("2-------显示先序遍历序列\n");
printf("3-------显示中序遍历序列\n");
printf("4-------显示后序遍历序列\n");
printf("5-------显示前序叶子结点个数\n");
printf("6-------验证二叉树的性质三\n");
printf("7-------退出程序\n");
printf("/**************************************/\n");
printf("请输入操作选择:
");
scanf("%d",&i);
switch(i)
{
case1:
printf("请输入二叉树元素:
");
CreateBiTree(&T);printf("\n");
gotostar;break;
case2:
printf("先序遍历二叉树结果序列:
\n");
PreOrder(T);printf("\n");
gotostar;break;
case3:
printf("中序遍历二叉树结果序列:
\n");
InOrder(T);printf("\n");
gotostar;break;
case4:
printf("后序遍历二叉树结果序列:
\n");
PostOrder(T);printf("\n");
gotostar;break;
case5:
printf("前序叶子结点为:
");
Pre(T);printf("\n");
printf("前序叶子结点个数为:
");
printf("%d",LeafCount(T));
printf("\n");
printf("\n");
gotostar;break;
case6:
printf("二叉树中度为2的节点的个数:
");
printf("%d\n",countdouble(T));
printf("二叉树中叶子结点个数为:
");
printf("%d",LeafCount(T));
printf("\n");
printf("叶子节点个数=度为2的节点个数+1");
printf("\n");
gotostar;break;
case7:
exit(0);break;
}
}
4测试数据与实验结果(可以抓图粘贴)
(1)输入二叉树元素:
(2)先序遍历二叉树结果序列:
(3)中序遍历二叉树结果序列:
(4)后序遍历二叉树结果序列:
(5)显示前序叶子结点个数
(6)验证二叉树的性质三
(7)退出程序
5结果分析与实验体会
这次是数据结构第三次实验,主要是关于树型的实验,本次试验的主要是要求我们熟练掌握二叉树的二叉链表表示及前序创建算法与实现,以及二叉树的前序、中序和后序递归遍历算法与实现;并且掌握中序遍历线索二叉树的基本算法与实现,以及中序遍历线索化二叉树的算法与实现。
通过本次试验,我理解了树的概念与定义,了解到本章的核心是树形结构的特性、存储及其操作实现,树结构是指具有分支关系的结构。
树形结构应用非常广泛,特别是在大量数据处理方面,如在文件系统、编译系统、目录组织等方面显得更加突出,而二叉树作为一种树结构显得更加简单而重要,本次试验主要实现了二叉树的各项功能。
数据结构对于C语言的要求较高,需要多在课后的时间多研究,身边的同学亦能给予非常大的帮助,对于这门课程的学习也在一次次的实验中显得更加得心应手。
创建二叉树参考程序
#include
#include
#include
typedefcharDataType;
typedefstructNode
{
DataTypedata;
structNode*LChild;
structNode*RChild;
}BiTNode,*BiTree;
voidCreateBiTree(BiTree*bt)
{
charch;
ch=getchar();
if(ch=='.')*bt=NULL;
else
{
*bt=(BiTree)malloc(sizeof(BiTNode));//生成一个新结点
(*bt)->data=ch;
CreateBiTree(&((*bt)->LChild));//生成左子树
CreateBiTree(&((*bt)->RChild));//生成右子树
}
}
voidVisit(charch)
{
printf("%c",ch);
}
voidPreOrder(BiTreeroot)
/*先序遍历二叉树,root为指向二叉树(或某一子树)根结点的指针*/
{
if(root!
=NULL)
{
Visit(root->data);/*访问根结点*/
PreOrder(root->LChild);/*先序遍历左子树*/
PreOrder(root->RChild);/*先序遍历右子树*/
}
}
voidmain()
{
BiTreeT;
printf("创建先序遍历序列二插树");
CreateBiTree(&T);
printf("先序遍历序列为:
");
PreOrder(T);
getch();
}