数据结构与算法实验二叉树基本操作.docx
- 文档编号:7952437
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:14
- 大小:246.65KB
数据结构与算法实验二叉树基本操作.docx
《数据结构与算法实验二叉树基本操作.docx》由会员分享,可在线阅读,更多相关《数据结构与算法实验二叉树基本操作.docx(14页珍藏版)》请在冰豆网上搜索。
数据结构与算法实验二叉树基本操作
二叉树基本操作
实验报告
二叉树基本操作实验报告
实验名称
二叉树基本操作
实验目的
1.熟悉二叉树结点的结构和二叉树的基本操作;
2.掌握二叉树每种操作的具体实现;
3.学会利用递归方法编写对二叉树这种递归数据结构进行处理的算法;
4.在二叉树基本操作的基础上掌握对二叉树的一些其它操作的具体实现方法;
5.掌握构造哈夫曼树以及哈夫曼编码的方法。
实验内容
编制一个演示二叉树创建、遍历、计算等操作的程序。
问题描述
用数据结构相关知识,实现二叉树的定义和操作。
该程序包括二叉树结构类型以及对二叉树操作的具体的函数定义(包括:
初始化二叉树、清空二叉树、检查二叉树是否为空、遍历二叉树(先序、后序、中序、层次)、求二叉树的深度、求二叉树所有节点数)。
问题分析
该实验是基于C语言和数据结构知识基础的对二叉树的基本操作的检验,无需设计复杂的算法,程序语句也相对简单。
因此,我直接按要求定义了对二叉树操作的具体函数,并于主函数中实现对应的功能调用,其中,功能选择靠switch语句实现。
实验步骤
1.需求分析
本演示程序用VC++编写,完成二叉树的生成、遍历、计算等基本操作。
1输入的形式和输入值的范围:
以字符(其中‘#’表示虚节点)的形式输入,以创建二叉树;在输入二叉树节点前,必须先确定该序列能正确创建二叉树。
② 输出的形式:
在所有三种操作中都显示操作是否正确以及操作后二叉树的内容。
③ 程序所能达到的功能:
完成二叉树的生成、遍历(包括先序、后序、中序、层次四种方式)、计算等基本操作。
④ 测试数据:
创建操作中依次输入a,b,d,#,g,#,#,#,c,e,#,#,f,#,#生成一个二叉树。
2.概要设计
1)为了实现上述程序功能,需要定义二叉树的抽象数据类型:
ADT BitTree {
数据对象:
由一个根节点和两个互不相交的左右子树构成
数据关系:
结点具有相同的数据类型及层次结构
基本操作:
VoidBinTreeInit(BitTree*T)
初始条件:
无
操作结果:
初始化一棵二叉树
VoidBinTreeCreat(BitTree*T)
初始条件:
二叉树T已存在
操作结果:
按先序次序创建一棵二叉树
2)本程序包含7个函数:
①主函数main() ②初始化二叉树函数BinTreeInit() ③建立一棵二叉树函数BinTreeCreat() ④先序遍历函数PreOrderTraverse() ⑤中序遍历函数InOrderTraverse()⑥后序遍历函数PostOrderTraverse()⑦层次遍历函数LevelOrderTraverse()⑧求二叉树深度函数Countlevel()⑨检验空树函数BinTreeEmpty()⑩求节点数函数Countnode()
函数说明
#include
#include
typedefcharDatatype;
typedefstructNodeType
{
Datatypedata;
structNodeType*lchild;
structNodeType*rchild;
}BiTNode;
typedefBiTNode*BinTree;
//初始化二叉树。
即把树指针置空
voidBinTreeInit(BiTNode*T)
{
//BiTNode*T;
T=(BiTNode*)malloc(sizeof(BiTNode));
T=NULL;
}
//二叉树的建立
BinTreeCreateBiTNode()
{
BiTNode*T;
Datatypech;
ch=getchar();
if(ch=='#')T=NULL;
else{
if(!
(T=(BiTNode*)malloc(sizeof(BiTNode))))printf("Error!
");
T->data=ch;
T->lchild=CreateBiTNode();
T->rchild=CreateBiTNode();
}
returnT;
}
//先序遍历
voidPreOrderTraverse(BiTNode*p){
if(p!
=NULL){
printf("%c",p->data);
PreOrderTraverse(p->lchild);
PreOrderTraverse(p->rchild);
}
}
//中序遍历
voidInOrderTraverse(BiTNode*p){
if(p!
=NULL){
InOrderTraverse(p->lchild);
printf("%c",p->data);
InOrderTraverse(p->rchild);
}
}
//后序遍历
voidPostOrderTraverse(BiTNode*p){
if(p!
=NULL){
PostOrderTraverse(p->lchild);
PostOrderTraverse(p->rchild);
printf("%c",p->data);
}
}
//层序遍历
voidLevelOrderTraverse(BiTNode*T){
BiTNode*queue[500],*p=T;
intfront=0,rear=0;
if(p!
=NULL){
queue[++rear]=p;//根结点入队
while(front p=queue[++front]; printf("%c",p->data); if(p->lchild! =NULL)queue[++rear]=p->lchild;//左结点入队 if(p->rchild! =NULL)queue[++rear]=p->rchild;//左结点入队 } } } //计算结点数 intCountnode(BiTNode*T){ intsum; if(T==NULL)return0; sum=1+Countnode(T->lchild)+Countnode(T->rchild); return(sum); } //计算叶子数 intCountleaf(BiTNode*T) { if(T==NULL)return0; else if(T->lchild==NULL&&T->rchild==NULL)return1; else returnCountleaf(T->lchild)+Countleaf(T->rchild); } //计算深度 intCountlevel(BiTNode*T){ intk; if(T==NULL)return0; if(Countlevel(T->lchild)>Countlevel(T->rchild)) k=1+Countlevel(T->lchild); elsek=1+Countlevel(T->rchild); returnk; } //检验二叉树是否为空 intBinTreeEmpty(BiTNode*T) { if(T==NULL) return1; else return0; } //清空二叉树 voidBinTreeClear(BiTNode*T) { if(T==NULL) { return; } if(T->lchild) { BinTreeClear(T->lchild); free(T->lchild); } if(T->rchild) { BinTreeClear(T->rchild); free(T->rchild); } } intmain(){ intcmd,mode,res,flag; BiTNode*T; while (1){ printf("===============菜单==============\n"); printf("\t1: 初始化\n\t2: 创建\n\t3: 遍历\n\t4: 计算\n\t5: 检验空树\n\t6: 清除二叉树\n\t0: 退出\n"); printf("===============菜单==============\n"); printf("请输入命令序号: \n"); scanf("%d",&cmd); getchar(); switch(cmd){ case1: BinTreeInit(T); printf("初始化二叉树成功! \n");getchar();break; case2: printf("创建。 按扩展二叉树的先序遍历序列输入结点,#表示虚结点\n"); T=CreateBiTNode(); //S=T; getchar();break; case3: printf("遍历。 输入遍历模式,1先序,2中序,3后序,4层序: "); scanf("%d",&mode); getchar(); switch(mode){ case1: PreOrderTraverse(T); putchar('\n');getchar();break; case2: InOrderTraverse(T); putchar('\n');getchar();break; case3: PostOrderTraverse(T); putchar('\n');getchar();break; case4: LevelOrderTraverse(T); putchar('\n');getchar();break; default: printf("模式选择有误! \n"); } break; case4: printf("计算。 输入具体计算项目,1结点数,2叶子数,3高度: "); scanf("%d",&mode); switch(mode){ case1: res=Countnode(T); printf("结点总数为: %d\n",res);break; case2: res=Countleaf(T); printf("叶子总数为: %d\n",res);break; case3: res=Countlevel(T); printf("树的高度为: %d\n",res);break; default: printf("选择项目有误! "); } break; case5: flag=BinTreeEmpty(T); if(flag==0) printf("二叉树不为空! \n"); else printf("二叉树为空! \n"); getchar();break; case6: BinTreeClear(T); T=NULL;//改变头结点指向,free函数不会改变头结点指向,所以需要令T=NULL使得T不再指向那些被释放掉的空间,使得程序能正常运行 printf("二叉树二叉树清除成功! \n"); getchar();break; case0: exit(0); } } }程序流程图 调试报告 发现问题: 在执行清空二叉树的函数后,再执行判断空树的函数时,输出"二叉树不为空! ”,与预期实验结果不符,而编译和组建时均为发出错误和警告信号。 调试: 经过单步运行调试后,发现是清空二叉树的函数出了问题,原因是: free函数不会改变头结点指向。 解决方案: 令T=NULL使得T不再指向那些被释放掉的空间,使得程序能正常运行。 结果: 修改完毕后现已得到正确结果"二叉树为空! ”。 使用说明 操作界面 初始化二叉树 创建一棵二叉树 先序遍历 中序遍历 后序遍历 层序遍历 求结点数 求叶子节点数 求二叉树的深度 检验空树 清空二叉树 检验空链表 退出 心得体会 1. 程序编写时,必须要细心。 有时候问题出现了,可能会一直查不出来,自己也不容易发现。 在编写这个程序时,我就出现了这个问题,之后一定要尽量避免此类问题出现。 2.加强练习,提高能力。 这几个子函数的名称都是我边看着书边写的,还没有完全脱离书本,把这个程序真正变成自己建的东西,所以我还要加强记忆,加强练习。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 算法 实验 二叉 基本 操作
![提示](https://static.bdocx.com/images/bang_tan.gif)