数据结构与算法实验二叉树基本操作Word文档格式.docx
《数据结构与算法实验二叉树基本操作Word文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构与算法实验二叉树基本操作Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
以字符(其中‘#’表示虚节点)的形式输入,以创建二叉树;
在输入二叉树节点前,必须先确定该序列能正确创建二叉树。
②
输出的形式:
在所有三种操作中都显示操作是否正确以及操作后二叉树的内容。
③
程序所能达到的功能:
完成二叉树的生成、遍历(包括先序、后序、中序、层次四种方式)、计算等基本操作。
④
测试数据:
创建操作中依次输入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<
stdio.h>
stdlib.h>
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;
lchild=CreateBiTNode();
rchild=CreateBiTNode();
}
returnT;
//先序遍历
voidPreOrderTraverse(BiTNode*p){
if(p!
=NULL){
printf("
%c"
p->
data);
PreOrderTraverse(p->
lchild);
rchild);
}
//中序遍历
voidInOrderTraverse(BiTNode*p){
InOrderTraverse(p->
//后序遍历
voidPostOrderTraverse(BiTNode*p){
PostOrderTraverse(p->
//层序遍历
voidLevelOrderTraverse(BiTNode*T){
BiTNode*queue[500],*p=T;
intfront=0,rear=0;
queue[++rear]=p;
//根结点入队
while(front<
rear){
p=queue[++front];
if(p->
lchild!
=NULL)queue[++rear]=p->
lchild;
//左结点入队
rchild!
rchild;
//计算结点数
intCountnode(BiTNode*T){
intsum;
if(T==NULL)return0;
sum=1+Countnode(T->
lchild)+Countnode(T->
return(sum);
//计算叶子数
intCountleaf(BiTNode*T)
else
if(T->
lchild==NULL&
&
T->
rchild==NULL)return1;
returnCountleaf(T->
lchild)+Countleaf(T->
//计算深度
intCountlevel(BiTNode*T){
intk;
if(Countlevel(T->
lchild)>
Countlevel(T->
rchild))
k=1+Countlevel(T->
elsek=1+Countlevel(T->
returnk;
//检验二叉树是否为空
intBinTreeEmpty(BiTNode*T)
if(T==NULL)
return1;
return0;
//清空二叉树
voidBinTreeClear(BiTNode*T)
{
return;
lchild)
BinTreeClear(T->
free(T->
rchild)
intmain(){
intcmd,mode,res,flag;
while
(1){
===============菜单==============\n"
\t1:
初始化\n\t2:
创建\n\t3:
遍历\n\t4:
计算\n\t5:
检验空树\n\t6:
清除二叉树\n\t0:
退出\n"
请输入命令序号:
\n"
scanf("
%d"
&
cmd);
getchar();
switch(cmd){
case1:
BinTreeInit(T);
初始化二叉树成功!
getchar();
break;
case2:
创建。
按扩展二叉树的先序遍历序列输入结点,#表示虚结点\n"
T=CreateBiTNode();
//S=T;
getchar();
break;
case3:
遍历。
输入遍历模式,1先序,2中序,3后序,4层序:
mode);
switch(mode){
PreOrderTraverse(T);
putchar('
\n'
InOrderTraverse(T);
PostOrderTraverse(T);
case4:
LevelOrderTraverse(T);
default:
模式选择有误!
计算。
输入具体计算项目,1结点数,2叶子数,3高度:
res=Countnode(T);
结点总数为:
%d\n"
res);
res=Countleaf(T);
叶子总数为:
res=Countlevel(T);
树的高度为:
选择项目有误!
case5:
flag=BinTreeEmpty(T);
if(flag==0)
二叉树不为空!
二叉树为空!
case6:
BinTreeClear(T);
T=NULL;
//改变头结点指向,free函数不会改变头结点指向,所以需要令T=NULL使得T不再指向那些被释放掉的空间,使得程序能正常运行
printf("
二叉树二叉树清除成功!
case0:
exit(0);
}程序流程图
调试报告
发现问题:
在执行清空二叉树的函数后,再执行判断空树的函数时,输出"
”,与预期实验结果不符,而编译和组建时均为发出错误和警告信号。
调试:
经过单步运行调试后,发现是清空二叉树的函数出了问题,原因是:
free函数不会改变头结点指向。
解决方案:
令T=NULL使得T不再指向那些被释放掉的空间,使得程序能正常运行。
结果:
修改完毕后现已得到正确结果"
”。
使用说明
操作界面
初始化二叉树
创建一棵二叉树
先序遍历
中序遍历
后序遍历
层序遍历
求结点数
求叶子节点数
求二叉树的深度
检验空树
清空二叉树
检验空链表
退出
心得体会
1.
程序编写时,必须要细心。
有时候问题出现了,可能会一直查不出来,自己也不容易发现。
在编写这个程序时,我就出现了这个问题,之后一定要尽量避免此类问题出现。
2.加强练习,提高能力。
这几个子函数的名称都是我边看着书边写的,还没有完全脱离书本,把这个程序真正变成自己建的东西,所以我还要加强记忆,加强练习。