二叉树基本操作演示程序的设计与实现Word格式文档下载.docx
- 文档编号:19882798
- 上传时间:2023-01-11
- 格式:DOCX
- 页数:15
- 大小:53.57KB
二叉树基本操作演示程序的设计与实现Word格式文档下载.docx
《二叉树基本操作演示程序的设计与实现Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《二叉树基本操作演示程序的设计与实现Word格式文档下载.docx(15页珍藏版)》请在冰豆网上搜索。
9个子功能的设计描述如下:
⑴树状输出二叉树。
树状输出二叉树由函数TranslevelPrint()实现。
当用户选择此功能时,系统即以树状的形式输出用户所创建的二叉树。
⑵先序遍历二叉树。
由函数Preorder()实现。
该功能按照先序遍历访问二叉树的方法输出先序序列。
⑶中序遍历二叉树。
由函数Inorder()实现。
该功能按照中序遍历访问二叉树的方法输出中序序列。
⑷后序遍历二叉树。
由函数Postorder()实现。
该功能按照后序遍历访问二叉树的方法输出后序序列。
⑸输出叶子结点。
该功能采用先序遍历二叉树的方法依次输出叶子结点。
由函数Preorderleaf()实现。
⑹输出叶子结点个数。
该功能计算并输出二叉树中叶子结点的个数,由LeafCount()实现。
采用递归算法计算二叉树中叶子结点的个数,算法思想是:
当二叉树为空树时,叶子结点总数为0;
当二叉树只有1个结点时,叶子结点总数为1;
否则,叶子结点个数等于左右子树叶子结点数之和。
⑺输出二叉树的深度。
该功能输出二叉树的深度,由函数PostorderDepth()实现,采用后序遍历的递归算法求二叉树的深度。
⑻括号形式输出二叉树。
以括号形式输出二叉树由函数,由函数output()实现。
当用户选择此功能时,系统即以括号形式输出二叉树。
⑼退出。
由exit(0)函数实现。
三、模块设计
1、模块设计
本程序包含三个模块,主程序模块、建立二叉树模块和工作区选择模块。
其调用关系如图2所示。
图2模块调用示意图
2、系统子程序用功能设计
本系统共设置12个子程序,各子程序的函数名及功能说明如下:
⑴voidCreateBiTree(BiTree&
T)//先序建立二叉树
⑵voidTranslevelPrint(BiTreeT)//树形打印二叉树
⑶voidVisit(charch)//输出结点
⑷voidPreorder(BiTreeT)//先序遍历二叉树
⑸voidInorder(BiTreeT)//中序遍历二叉树
⑹voidPostorder(BiTreeT)//后序遍历二叉树
⑺voidPreorderLeaf(BiTreeT)//输出叶子结点
⑻intLeafCount(BiTreeT)//输出叶子结点的个数
⑼intPostorderDepth(BiTreeT)//输出二叉树的深度
⑽voidoutput(BiTreeT)//以括号形式输出二叉树
⑾voidmainwork()//主工作函数,操作区用户界面
⑿voidmain()//主函数。
创建二叉树,调用工作区模块函数
3、函数主要调用关系图
本系统12个子程序之间的主要调用关系如图3所示。
图中数字是各函数的编号。
图3系统函数调用关系图
四、详细设计
1、数据类型定义
typedefstructBiTNode//定义二叉树结点结构
{chardata;
structBiTNode*lchild,*rchild;
}BiTNode,*BiTree;
2、系统主要子程序详细设计
⑴主函数模块
主函数。
创建二叉树,调用工作区模块函数。
voidmain()
{cout<
<
"
\n"
;
CreateBiTree(T);
cout<
\n"
mainwork();
}
⑵建立二叉树模块
voidCreateBiTree(BiTree&
T)//先序建立二叉树
{charch;
cin>
>
ch;
if(ch=='
#'
)T=NULL;
else
{T=newBiTNode;
T->
data=ch;
CreateBiTree(T->
lchild);
rchild);
}
⑶用户工作区模块
主工作函数,操作区用户界面设计。
voidmainwork()
{intyourchoice;
\n---------------欢迎使用二叉树基本操作程序-----------------\n"
\n菜单选择\n\n"
1.树状输出二叉树2.先序遍历二叉树\n"
3.中序遍历二叉树4.后序遍历二叉树\n"
5.输出叶子结点6.输出叶子结点个数\n"
7.输出二叉树的深度8.括号形式输出二叉树\n"
9.退出\n"
\n----------------------------------------------------------\n"
请输入你的选择:
"
yourchoice;
while(!
(yourchoice==1||yourchoice==2||yourchoice==4||yourchoice==5||
yourchoice==6||yourchoice==7||yourchoice==8||yourchoice==9))
{cout<
输入不正确,请重新输入\n"
while
(1)
{switch(yourchoice)
{case1:
cout<
树的形状为:
TranslevelPrint(T);
break;
case2:
先序遍历为:
Preorder(T);
case3:
中序遍历为:
Inorder(T);
case4:
后序遍历为:
Postorder(T);
case5:
叶子结点为:
PreorderLeaf(T);
case6:
叶子结点个数为:
LeafCount(T);
case7:
二叉树的深度为:
PostorderDepth(T);
case8:
括号形式输出二叉树为:
output(T);
case9:
system("
cls"
);
exit(0);
break;
default:
\n按任意键继续:
getch();
system("
}//endwhile
(1)
}//endmainwork
五、测试结果
根据先根结点,按照从上到下,从左到右的次序依次先根遍历的方法,分别输入二叉树的结点序列(#号表示该结点为空)。
例如,输入“ABD##E##CH###”,程序运行得到如图1所示的开始界面。
各子功能测试运行结果如下。
1、树状输出二叉树
在主菜单下,用户输入1并回车,运行结果如图4所示。
图4按树形输出所创建的二叉树
2、先序遍历二叉树
在主菜单下,用户输入2并回车,运行结果如图5所示。
图5输出二叉树的先序遍历序列
3、中序遍历二叉树
在主菜单下,用户输入3并回车,运行结果如图6所示。
4、后序遍历二叉树
在主菜单下,用户输入4并回车,运行结果如图7所示。
图6输出二叉树的中序遍历序列图7输出二叉树的后序遍历序列
5、输出叶子结点
在主菜单下,用户输入5并回车,运行结果如图8所示。
6、输出叶子结点个数
在主菜单下,用户输入6并回车,运行结果如图9所示。
图8输出二叉树的叶子结点图9输出二叉树的叶子结点个数
7、输出二叉树的深度
在主菜单下,用户输入7并回车,运行结果如图10所示。
8、括号形式输出二叉树
在主菜单下,用户输入8并回车,运行结果如图11所示。
图10输出二叉树的深度图11以括号形式输出二叉树
9、退出
在主菜单下,用户输入9并回车,即退出“二叉树基本操作程序”。
六、用户使用说明
1、本程序执行文件为“二叉树的基本操作演示.exe”。
2、进入本程序后,首先按照提示输入二叉树的结点,如按下列次序顺序读入字符ABD##E##CH###。
3、随即显示系统主菜单界面,用户可在该界面下输入各功能前对应的数字并按回车,执行相应命令。
七、实验体会(略)
八、源程序清单
//二叉树基本操作演示程序的设计与实现
//二叉树的基本操作演示.CPP
#include<
iostream.h>
#include"
stdlib.h"
conio.h"
math.h"
#defineMaxSize100
#defineNLAYER4
typedefstructBiTNode
BiTreeT;
//1.建立二叉树
)
T=NULL;
//2.树形打印二叉树
voidTranslevelPrint(BiTreeT)
{//本算法实现二叉树按层打印
structnode
{BiTreevec[MaxSize];
//存放树结点
intlayer[MaxSize];
//结点所在的层
intlocate[MaxSize];
//打印结点的位置
intfront,rear;
}q;
//定义队列q
inti,j=1,k=0,nLocate;
q.front=q.rear=0;
//初始化队列q队头、队尾
\n"
q.vec[q.rear]=T;
//二叉树的根结点入队
q.layer[q.rear]=1;
q.locate[q.rear]=20;
q.rear=q.rear+1;
while(q.front<
q.rear)
{T=q.vec[q.front];
i=q.layer[q.front];
nLocate=q.locate[q.front];
if(j<
i)//进层打印时换行
\n\n"
j=j+1;
k=0;
while(k++<
nLocate)cout<
while(k++<
nLocate-1)cout<
//结点深度控制横向位置
T->
data;
q.front=q.front+1;
if(T->
lchild!
=NULL)//存在左子树,将左子树的根结点入队列
{q.vec[q.rear]=T->
lchild;
q.layer[q.rear]=i+1;
q.locate[q.rear]=int(nLocate-pow(2,NLAYER-i-1));
rchild!
=NULL)//存在右子树,将右子树的根结点入队列
rchild;
q.locate[q.rear]=int(nLocate+pow(2,NLAYER-i-1));
//3.输出结点
voidVisit(charch)
{
//4.先序遍历二叉树
voidPreorder(BiTreeT)
{//先序遍历二叉树,T为指向二叉树(或某一子树)根结点的指针
if(T!
=NULL)
{
Visit(T->
data);
//访问根结点
Preorder(T->
//先序遍历左子树
//先序遍历右子树
//5.中序遍历二叉树
voidInorder(BiTreeT)
{//中序遍历二叉树,T为指向二叉树(或某一子树)根结点的指针
Inorder(T->
//中序遍历左子树
//中序遍历右子树
//6.后序遍历二叉树
voidPostorder(BiTreeT)
{//后序遍历二叉树,T为指向二叉树(或某一子树)根结点的指针
Postorder(T->
//后序遍历左子树
//后序遍历右子树
//7.输出叶子结点
voidPreorderLeaf(BiTreeT)
{//先序遍历二叉树并输出叶子结点,T为指向二叉树根结点的指针
{if(T->
lchild==NULL&
&
rchild==NULL)
PreorderLeaf(T->
//8.输出叶子结点的个数
intLeafCount(BiTreeT)
{intLeafNum;
if(T==NULL)LeafNum=0;
elseif((T->
lchild==NULL)&
(T->
rchild==NULL))LeafNum=1;
elseLeafNum=LeafCount(T->
lchild)+LeafCount(T->
returnLeafNum;
//9.输出二叉树的深度
intPostorderDepth(BiTreeT)
{//后序遍历求二叉树深度的递归算法
inthl,hr,max;
hl=PostorderDepth(T->
//求左子树的深度
hr=PostorderDepth(T->
//求右子树的深度
max=hl>
hr?
hl:
hr;
//得到左右子树深度较大者
return(max+1);
//返回树的深度
elsereturn0;
//空树返回0
//10.以括号形式输出二叉树
voidoutput(BiTreeT)
{if(T!
if(T->
=NULL||T->
("
output(T->
=NULL)cout<
"
)"
//11.主工作函数,操作区用户界面
//12.主函数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二叉 基本 操作 演示 程序 设计 实现
