1、以字符(其中#表示虚节点)的形式输入,以创建二叉树;在输入二叉树节点前,必须先确定该序列能正确创建二叉树。输出的形式:在所有三种操作中都显示操作是否正确以及操作后二叉树的内容。程序所能达到的功能:完成二叉树的生成、遍历(包括先序、后序、中序、层次四种方式)、计算等基本操作。测试数据:创建操作中依次输入a,b,d,#,g,#,#,#,c,e,#,#,f,#,#生成一个二叉树。2概要设计1)为了实现上述程序功能,需要定义二叉树的抽象数据类型:ADTBitTree数据对象:由一个根节点和两个互不相交的左右子树构成数据关系:结点具有相同的数据类型及层次结构基本操作:Void BinTreeInit(B
2、itTree *T)初始条件:无操作结果:初始化一棵二叉树Void BinTreeCreat(BitTree *T)二叉树T已存在按先序次序创建一棵二叉树2)本程序包含7个函数:主函数main()初始化二叉树函数 BinTreeInit()建立一棵二叉树函数BinTreeCreat()先序遍历函数PreOrderTraverse()中序遍历函数 InOrderTraverse()后序遍历函数 PostOrderTraverse()层次遍历函数 LevelOrderTraverse()求二叉树深度函数 Countlevel()检验空树函数BinTreeEmpty()求节点数函数 Countnod
3、e()函数说明#includestdlib.htypedef char Datatype;typedef struct NodeType Datatype data; struct NodeType *lchild; struct NodeType *rchild;BiTNode;typedef BiTNode * BinTree;/初始化二叉树。即把树指针置空void BinTreeInit(BiTNode *T) / BiTNode *T; T=(BiTNode *)malloc(sizeof(BiTNode); T=NULL;/二叉树的建立BinTree CreateBiTNode()
4、BiTNode *T; Datatype ch; ch=getchar(); if(ch=#) T=NULL; else if(!(T=(BiTNode *)malloc(sizeof(BiTNode) printf(Error!); T-data=ch;lchild=CreateBiTNode();rchild=CreateBiTNode(); return T;/先序遍历void PreOrderTraverse(BiTNode *p) if(p!=NULL) printf(%c ,p-data); PreOrderTraverse(p-lchild);rchild); /中序遍历void
5、 InOrderTraverse(BiTNode *p) InOrderTraverse (p-/后序遍历void PostOrderTraverse(BiTNode *p) PostOrderTraverse(p-/层序遍历void LevelOrderTraverse(BiTNode *T) BiTNode *queue500,*p=T; int front=0,rear=0; queue+rear=p; /根结点入队 while(frontlchild!=NULL) queue+rear=p-lchild; /左结点入队rchild!rchild;/计算结点数int Countnode(
6、BiTNode *T) int sum; if(T=NULL) return 0; sum=1+Countnode(T-lchild)+Countnode(T- return(sum);/计算叶子数int Countleaf(BiTNode *T) else if(T-lchild=NULL&T-rchild=NULL) return 1; return Countleaf(T-lchild)+Countleaf(T-/计算深度int Countlevel(BiTNode *T) int k; if(Countlevel(T-lchild)Countlevel(T-rchild) k=1+Co
7、untlevel(T- else k=1+Countlevel(T- return k;/ 检验二叉树是否为空int BinTreeEmpty(BiTNode *T) if(T=NULL) return 1; return 0;/ 清空二叉树void BinTreeClear(BiTNode *T) return;lchild) BinTreeClear(T- free(T-rchild)int main() int cmd,mode,res,flag; while(1)=菜单=nt1:初始化nt2:创建nt3:遍历nt4:计算nt5:检验空树nt6:清除二叉树nt0:退出n请输入命令序号:n
8、 scanf(%d,&cmd); getchar(); switch(cmd) case 1: BinTreeInit(T);初始化二叉树成功!getchar();break; case 2:创建。按扩展二叉树的先序遍历序列输入结点,# 表示虚结点n T=CreateBiTNode(); /S=T; getchar(); break; case 3:遍历。输入遍历模式,1先序,2中序,3后序,4层序:mode); switch(mode) PreOrderTraverse(T); putchar(n InOrderTraverse(T); PostOrderTraverse(T); case
9、4: LevelOrderTraverse(T); default :模式选择有误!计算。输入具体计算项目,1结点数,2叶子数,3高度: res=Countnode(T);结点总数为:%dn,res); res=Countleaf(T);叶子总数为: res=Countlevel(T);树的高度为:选择项目有误! case 5: flag=BinTreeEmpty(T); if(flag=0)二叉树不为空!二叉树为空! case 6: BinTreeClear(T); T=NULL;/改变头结点指向,free函数不会改变头结点指向,所以需要令T=NULL使得T不再指向那些被释放掉的空间,使得程
10、序能正常运行 printf(二叉树二叉树清除成功! case 0: exit(0);程序流程图调试报告发现问题:在执行清空二叉树的函数后,再执行判断空树的函数时,输出”,与预期实验结果不符,而编译和组建时均为发出错误和警告信号。调试:经过单步运行调试后,发现是清空二叉树的函数出了问题,原因是: free函数不会改变头结点指向。解决方案:令T=NULL使得T不再指向那些被释放掉的空间,使得程序能正常运行。结果:修改完毕后现已得到正确结果”。使用说明操作界面初始化二叉树创建一棵二叉树先序遍历中序遍历后序遍历层序遍历求结点数求叶子节点数求二叉树的深度检验空树清空二叉树检验空链表退出心得体会1. 程序编写时,必须要细心。有时候问题出现了,可能会一直查不出来,自己也不容易发现。在编写这个程序时,我就出现了这个问题,之后一定要尽量避免此类问题出现。2. 加强练习,提高能力。这几个子函数的名称都是我边看着书边写的,还没有完全脱离书本,把这个程序真正变成自己建的东西,所以我还要加强记忆,加强练习。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1