完整二叉树结构实现及测试.docx
- 文档编号:8247281
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:17
- 大小:220.57KB
完整二叉树结构实现及测试.docx
《完整二叉树结构实现及测试.docx》由会员分享,可在线阅读,更多相关《完整二叉树结构实现及测试.docx(17页珍藏版)》请在冰豆网上搜索。
完整二叉树结构实现及测试
算法与数据结构课程设计
题目:
完整的二叉树结构的实现及测试
专业信息管理与信息系统
班级1102
学生邹欣
学号3110302215
指导教师鲍春波章静
2018年6月21日–27日
1.系统分析
完整的二叉树结构的实现及测试,通过对每一个关于二叉树的功能,从创建、输入、遍历、求结点、求深度等分模块进行规划!
在通过main函数和函数调用的方法加以连接,设计一个主页面就可以了!
2.系统设计
(1>:
数据结构设计思想
根据二叉树的定义和特点,从根本上全面的反应二叉树的特点和知识!
先写好每一个功能函数的代码,放在主函数的前面,再写好主函数的代码,在主函数中通过switch……case…..相应的调用与用户选择一致的函数,从而测试每一个功能。
(2>:
系统功能总体设计
(3>:
各个功能模块的详细设计
创建二叉树:
计算叶子节点:
计算节点数
树的深度先序非递归遍历
中序递归遍历先序递归遍历
4;系统界面设计:
------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------
3
1)函数原型#include
#include
2)主函数voidmain(void>
{
intchoice,Y。
BiTreeTT,q。
menu(>。
TT=InitiateHead(>。
printf("\n请输入你的选择:
\n">。
scanf("%d",&choice>。
while(choice>
{
switch(choice>
{
case0:
system("cls">。
exite(>。
break。
case1:
system("cls">。
printf("请输入结点如右面所示格式:
1230400056700\n">。
CreateBiTree(&TT>。
menu(>。
break。
case2:
system("cls">。
printf("请输入要查找的结点信息:
\n">。
scanf("%d",&Y>。
q=Search(TT,Y>。
if(q>printf("查找成功!
!
\n">。
elseprintf("查找失败!
!
\n">。
menu(>。
break。
case3:
system("cls">。
bianli(TT>。
menu(>。
break。
case4:
system("cls">。
Root(TT>。
menu(>。
break。
case5:
system("cls">。
printf("打印出来的树的形状是:
\n">。
PrintTree(TT,0>。
menu(>。
break。
3功能模块函数:
初始化二叉树
BiTreeInitiateHead(>
{
BiTNode*bt。
bt=(BiTNode*>malloc(sizeof(BiTNode>>。
bt->lchild=NULL。
bt->rchild=NULL。
returnbt。
}
建立二叉树
voidCreateBiTree(BiTree*T>
{
datatypech。
scanf("%d",&ch>。
if(ch==Nil>
*T=NULL。
else
{
*T=(BiTNode*>malloc(sizeof(BiTNode>>。
/为T开区间/
if(!
(*T>>/如果T不为空/
return。
(*T>->data=ch。
CreateBiTree(&((*T>->lchild>>。
/创建左孩子/
CreateBiTree(&((*T>->rchild>>。
/创建右孩子/
}
}
查找值为X的结点
BiTreeSearch(BiTreebt,datatypex>
{
BiTreep。
if(bt==NULL>/表空查找失败/
returnNULL。
elseif(bt->data==x>
returnbt。
else
{
p=Search(bt->lchild,x>。
if(p>/如果p非空/
returnp。
else
{
p=Search(bt->rchild,x>。
if(p>
returnp。
else
returnNULL。
}
}
}
前序递归遍历此二叉树
voidfInOrder(BiTreeT>
{
if(T>/如果T非空/
{
printf("%d",T->data>。
/访问结点/
fInOrder(T->lchild>。
/访问结点的左孩子/
fInOrder(T->rchild>。
/访问结点的右孩子/
}
}
中序遍历此二叉树
voidInOrder(BiTreeT>
{
if(T>/如果T非空/
{
InOrder(T->lchild>。
/访问结点的左孩子/
printf("%d",T->data>。
/访问结点/
InOrder(T->rchild>。
/访问结点的右孩子/
}
}
后序递归遍历此二叉树
voidlInOrder(BiTreeT>
{
if(T>/如果T非空/
{
lInOrder(T->lchild>。
/访问结点的左孩子/
lInOrder(T->rchild>。
/访问结点的右孩子/
printf("%d",T->data>。
/访问结点/
}
}
先序非递归遍历此二叉树
voidNRPreOrder(BiTreebt>
{
BiTNode*stack[MAXSIZE]。
/利用入栈出栈的思想来实现/
BiTNode*p。
inttop=-1。
if(bt==NULL>
return。
p=bt。
while(!
(p==NULL&&top==-1>>/判断P是否为空以及TOP是否为-1,不是执行/
{
while(p!
=NULL>
{
printf("%d",p->data>。
/输出根结点/
top++。
stack[top]=p。
/左孩子一直入栈/
p=p->lchild。
/到左孩子的叶子结点/
}
if(top<0>/判断top/
return。
else
{
p=stack[top]。
/左孩子的叶子结点出栈/
top--。
p=p->rchild。
/判断P的右孩子是否为空/
}
}
}
中序非递归遍历此二叉树
voidNRInOrder(BiTreebt>
{
BiTNode*stack[MAXSIZE]。
BiTNode*p。
inttop=-1。
if(bt==NULL>
return。
p=bt。
while(!
(p==NULL&&top==-1>>/判断P是否为空以及TOP是否为-1,不是执行/
{
while(p!
=NULL>
{
top++。
stack[top]=p。
p=p->lchild。
/到左孩子的叶子结点/
}
if(top<0>/判断top/
return。
else
{
p=stack[top]。
/左孩子的叶子结点出栈/
top--。
printf("%d",p->data>。
/输出根结点/
p=p->rchild。
/判断P的右孩子是否为空/
}
}
}
后序非递归遍历此二叉树
voidNRPostOrder(BiTreebt>
{
BiTNode*stack[MAXSIZE],*p=bt/用do….while…和栈的思想语句实现/
inttag[MAXSIZE]。
inttop=-1。
do
{
while(p!
=NULL>
{
stack[++top]=p。
tag[top]=0。
p=p->lchild。
}
if(top>=0>
{
if(!
tag[top]>
{
p=stack[top]。
p=p->rchild。
tag[top]=1。
}
else
printf("%d",stack[top--]->data>。
}
}while((p!
=NULL>||(top>=0>>。
}
遍历此二叉树
voidbianli(BiTreeT>
{
intchoice,a,b。
printf("请选择遍历的方法\n">。
printf("**1---递归遍历*****\n">。
printf("**2---非递归遍历*****\n">。
scanf("%d",&choice>。
switch(choice>
{
case1:
printf("你选择的递归遍历\n">。
printf("请再选择遍历的方法\n">。
printf("**1---先序递归遍历**\n">。
printf("**2---中序递归遍历**\n">。
printf("**3---后序递归遍历**\n">。
scanf("%d",&a>。
switch(a>
{
case1:
printf("先序递归遍历的结果是。
\n">。
fInOrder(T>。
break。
case2:
printf("中序递归遍历的结果是。
\n">。
InOrder(T>。
break。
case3:
printf("后序递归遍历的结果是。
\n">。
lInOrder(T>。
break。
}
break。
case2:
printf("你选择的非递归遍历\n">。
printf("请再选择遍历的方法\n">。
printf("**1---先序非递归遍历**\n">。
printf("**2---中序非递归遍历**\n">。
printf("**3---后序非递归遍历**\n">。
scanf("%d",&b>。
switch(b>
{
case1:
printf("先序非递归遍历的结果是。
\n">。
NRPreOrder(T>。
break。
case2:
printf("中序非递归遍历的结果是。
\n">。
NRInOrder(T>。
break。
case3:
printf("后序非递归遍历的结果是。
\n">。
NRPostOrder(T>。
break。
}
break。
}
printf("\n">。
}
intVisit(BiTNode*bn>
{
returnbn->data。
}
求二叉树的根
voidRoot(BiTreebt>
{
if(bt==NULL>
printf("根为空\n">。
else
printf("二叉树的根是%d\n",bt->data>。
}
打印二叉树
voidPrintTree(BiTreeT,intm>/递归调用打印二叉树/
{
intj。
if(T->rchild>
PrintTree(T->rchild,m+1>。
for(j=1。
j<=m。
j++>
printf("">。
/打印空格/
if(T->lchild>
PrintTree(T->lchild,m+1>。
}
计算叶子结点
intCountLeaf(BiTreebt>
{
if(bt==NULL>
return0。
if(bt->lchild==NULL&&bt->rchild==NULL>/判断是否为叶子结点/
return1。
return(CountLeaf(bt->lchild>+CountLeaf(bt->rchild>>。
/左右叶子结点数相加/
}
计算结点数
intCountBiTNodes(BiTreebt>
{
if(bt==NULL>
return0。
if(bt->lchild==NULL&&bt->rchild==NULL>
return1。
return(CountBiTNodes(bt->lchild>+CountBiTNodes(bt->rchild>+1>。
/递归调用/
}
计算树的深度
intCountDepth(BiTreebt>
{
intlChildDepth,rChildDepth。
if(bt==NULL>
return0。
if(bt->lchild==NULL&&bt->rchild==NULL>/一直深入查找,递归调用/
return1。
else
{
lChildDepth=CountDepth(bt->lchild>。
/递归调用/
rChildDepth=CountDepth(bt->rchild>。
/递归调用/
return((lChildDepth>rChildDepth>?
(lChildDepth+1>:
(rChildDepth+1>>。
/谁大取谁/
}
}
退出
voidexite(void>
{
printf("byebye!
\n">。
exit(0>。
}
界面菜单
voidmenu(void>
{
printf("||----------------------------|||\n">。
printf("||完整二叉树的实现及测试|||\n">。
printf("||0----退出--------------------|||\n">。
printf("||1:
建立二叉树------------|||\n">。
printf("||2:
查找值为X是我结点-|||\n">。
printf("||3:
遍历此二叉树----------|||\n">。
printf("||4:
求二叉树的根-----------||\n">。
printf("||5:
打印此二叉树-----------|||\n">。
printf("||6。
计算叶子结点-----------|||\n">。
printf("||7:
计算结点数---------|||\n">。
printf("||8:
计算树的深度------|||\n">。
}
4.系统测试
选择1----
选择2---
选择3-1-1
选择4:
--
选择5—
选择6--------
选择7---
选择8----
5.心得体会:
写的不好,请多多关照。
6.参考文献
1:
数据结构课本—厦大出版社-
2:
网站资料-------
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 完整 二叉 结构 实现 测试