数据结构课程设计二叉树的基本操作Word文档格式.docx
《数据结构课程设计二叉树的基本操作Word文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计二叉树的基本操作Word文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
三、数据结构和算法设计
用一个字符型保存节点数据,分别定义两个
BiTree.h中实现相关的功能。
3.1二叉链表的设计
1.
typedef
structBiNode{
2.
char
data;
3.
struct
BiNode*lchild;
//
左孩子
4.
BiNode*rchild;
右孩子
5.
}BiTree;
structBiNode类型的指针来指向左孩子和右孩子。
在
3.2队列的实现
typedefstruct
{
ElemType*data;
inthead;
//
队头指针
inttail;
队尾指针
}SqQueue;
队列主要用于二叉树遍历过程中的层序遍历,从根节点开始分别将左右孩子放入队列,然后从对头开
始输出。
队列的相关操作封装在SqQueue.h中,包括入队、出队、判断队列是否为空等操作。
四、全局函数的设计
本程序中应用了一些全局函数,本着用到那个函数就把哪个函数设为全局函数的原则,抽象出了以下全局函数:
4.1全局函数列表
(1)BiTree*createBinaryTree(BiTree*b)
本函数用于建立二叉树
(2)voidTraverse(BiTree*b)
本函数用于遍历二叉树
(3)voidPreOrderTraverse(BiTree*b)
本函数用于前序遍历二叉树
(4)voidInOrderTraverse(BiTree*b)
本函数用于中序遍历二叉树
(5)voidPostOrderTraverse(BiTree*b)
本函数用于后序遍历二叉树
(6)voidLevelOrderTraverse(BiTree*b)
本函数用于层序遍历二叉树
(7)voidgetLeavesNum(BiTree*b)
本函数用于统计叶子结点个数
(8)intgetHeight(BiTree*b)
本函数用于求二叉树的深度
(9)voidswap(BiTree*b)
本函数用子树交换
(10)voiddisplayMenu()
本函数用于展示菜单
4.2全局函数在具体系统中的分布
BiTree.h
此文件为二叉树的头文件,包含上述所有全局函数
五、功能实现
二叉树的基本操作这个程序的主要功能就是建立二叉树,然后运用先序、中序等遍历方法遍历二叉树,然后还有统计二叉树的叶子结点个数、求二叉树的深度以及进行子树的交换。
5.1二叉树的基本操作流程图如下
菜单界面如下:
5.2二叉树的基本操作的代码如下
5.2.1二叉树的建立
1.//按照前序输入二叉树结点的值,“#”表示空
2.BiTree*createBinaryTree(BiTree*b){
3.charch;
//定义变量用于储存输入的字符
scanf("
%c"
&
ch);
if(ch=='
#'
){
6.
b=NULL;
7.
}
8.
else{
9.
if((b=(BiTree*)malloc(sizeof(BiTree)))!
=NULL){
//如果内存分配成功就执行下面操
作
10.
//生成根节点
11.
b->
data=ch;
12.
//构造左子树
13.
lchild=createBinaryTree(b->
lchild);
14.
//构造右子树
15.
rchild=createBinaryTree(b->
rchild);
16.
17.
18.
returnb;
19.
5.2.2二叉树的遍历
如图所示选择遍历后有三种方案可供选择:
1)前序遍历
voidPreOrderTraverse(BiTree*b){
if(b==NULL){
return;
//首先打印结点数据
printf("
%c"
b->
data);
//再先序遍历左子树
PreOrderTraverse(b->
//最后先序遍历右子树
5
2)中序遍历
//中序遍历
voidInOrderTraverse(BiTree*b){
//首先中序遍历左子树
InOrderTraverse(b->
//再打印结点数据
//最后中序遍历右子树
3)后序遍历
//后序遍历
voidPostOrderTraverse(BiTree*b){
//首先后序遍历左子树
PostOrderTraverse(b->
//再后序遍历右子树
//最后打印结点数据
4)层序遍历
1.//层序遍历
2.voidLevelOrderTraverse(BiTree*b){
3.SqQueue*s=initSqQueue();
4.BiTree*temp;
5.if(b){
6.append(s,*b);
7.while(!
isEmpty(s)){
5.2.3统计叶子结点个数
//统计叶子节点
int
count;
//全局变量,如果出现叶子结点就加一
void
getLeavesNum(BiTree*b){
if(b){
if(!
lchild&
&
!
rchild){
count++;
getLeavesNum(b->
5.3.4求二叉树的深度
1.//求二叉树的深度
2.intgetHeight(BiTree*b){
3.intleftHeight,rightHeight;
4.if(!
b){
5.return0;
6.}
7.leftHeight=getHeight(b->
8.rightHeight=getHeight(b->
9.returnleftHeight>
rightHeight?
leftHeight+1:
rightHeight+1;
10.}
5.2.5子树交换
1.//子树交换
BiTree*temp;
//临时变量,用于交换
voidswap(BiTree*b){
temp=b->
lchild;
lchild=b->
rchild;
rchild=temp;
swap(b->
部分运行结果截图如下:
建立二叉树:
统计叶子节点个数:
求二叉树的深度:
六、参考文献
1.StephenPrata.《CPrimerPlus(第6版)中文版》.人民邮电出版社.2016年
2.CSDN博客:
3.谭浩强.《C程序设计(第四版)》.清华大学出版社.
4.严蔚敏《数据结构》
c语言版第二版人民邮电出版社