数据结构课程设计二叉树.docx
《数据结构课程设计二叉树.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计二叉树.docx(10页珍藏版)》请在冰豆网上搜索。
![数据结构课程设计二叉树.docx](https://file1.bdocx.com/fileroot1/2022-12/31/abdfe13b-dfed-475c-904f-7353a08cff79/abdfe13b-dfed-475c-904f-7353a08cff791.gif)
数据结构课程设计二叉树
目录
一、问题描述1
二、测试数据1
三、算法思想1
四、模块划分1
五、数据结构2
六、源程序2
七、测试情况7
八、设计体会8
参考文献9
一、问题描述
(1)用二叉链表存储表示法,定义一颗排序二叉树;
(2)输入树的各个结点,用先序遍历的的顺序建立二叉链表。
按先序输入二叉树中结点的值,创建二叉链表表示的二叉树T;
(3)对建立的排序二叉树进行层次、先序、中序和后序遍历并统计该二叉树中叶子结点的数目;
(4)用菜单实现各部分的操作;
二、测试数据
建立二叉树:
ABC##DE#G##F###
三、算法思想
在本课程设计中涉及的算法大部分用了递归的算法思想。
递归即是一个过程和函数在其自定义或说明中又直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解
四、模块划分
(1)voidPreOrderTraverse(BiTreeT)、voidPostOrderTraverse(BiTreeT)、voidInOrderTraverse(BiTreeT),这几个函数分别为前序、后序、中序遍历二叉树,都用了递归的算法思想,对二叉树进行不同次序的遍历。
前、中、后序分别按根->左->右、左->根->右、左->右->根的顺序遍历结点;
(2)voidCreateBiTree(BiTree&T),此函数功能是通过先序遍历的的顺序建立二叉树。
按先序次序输入二叉树中结点的值(一个字符),创建二叉链表表示的二叉树T;
(3)voidlev_traverse(BiTreeT),此函数功能为按层遍历二叉树。
其中借鉴了循环队列进队、出队的算法思想,通过不断地对二叉树节点进行进队出队,从上到下从左到右遍历了二叉树;
(4)intleaf(BiTreeT),此函数用递归方法求二叉树的叶子数.当某节点无左子树和右子树时,二叉树的叶子数就等于没有子树的节点个数。
五、数据结构
用二叉树的二叉链表存储法表示二叉树T
typedefstructBiNode
{
chardata;//结点数据域
structBiNode*lchild,*rchild;//左右孩子指针
}BiTNode,*BiTree;
六、源程序
#include
usingnamespacestd;
#defineMAXQSIZE100
#defineOK1
#defineERROR0
#defineOVERFLOW-2
typedefintStatus;
#defineMAXSIZE100
typedefintStatus;
typedefstructBiNode//二叉树的二叉链表存储表示
{
chardata;//结点数据域
structBiNode*lchild,*rchild;//左右孩子指针
}BiTNode,*BiTree;
typedefstruct{
BiTree*base;
BiTree*top;
intstacksize;
}SqStack;
typedefstruct{
BiTree*base;//初始化时动态分配存储空间
intfront;//头指针
intrear;//尾指针
}SqQueue;
StatusInitQueue(SqQueue&Q)
{//循环队列的初始化。
构造一个空队列Q
Q.base=newBiTree[MAXQSIZE];
if(!
Q.base)
{
returnOVERFLOW;//存储分配失败
}
Q.front=0;
Q.rear=0;
returnOK;
}
intQueueLength(SqQueueQ)
{//返回Q的元素个数,即队列的长度
return(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
}
StatusEnQueue(SqQueue&Q,BiTreee)
{//循环队列的入队,插入元素e为Q的新的队尾元素
if((Q.rear+1)%MAXQSIZE==Q.front)
{
returnERROR;//尾指针在循环意义上加1后等于头指针,表明队满
}
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXQSIZE;
returnOK;
}
StatusDeQueue(SqQueue&Q,BiTree&e)
{//循环队列的出队
if(Q.rear==Q.front)
{
returnERROR;
}
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXQSIZE;
returnOK;
}
voidCreateBiTree(BiTree&T)
{
//先序遍历的的顺序建立二叉链表。
按先序次序输入二叉树中结点的值(一个字符),创建二叉链表表示的二叉树T
charch;
cin>>ch;
if(ch=='#')T=NULL;//递归结束,建空树
else{
T=newBiTNode;
T->data=ch;//生成根结点
CreateBiTree(T->lchild);//递归创建左子树
CreateBiTree(T->rchild);//递归创建右子树
}//else
}//CreateBiTree
voidPreOrderTraverse(BiTreeT)
{
//先序遍历二叉树T的递归算法
if(T){
cout<data;
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
voidPostOrderTraverse(BiTreeT)
{
//后序遍历二叉树T的递归算法
if(T){
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout<data;
}
}
voidInOrderTraverse(BiTreeT)
{
//中序遍历的递归算法
if(T){
InOrderTraverse(T->lchild);
cout<data;
InOrderTraverse(T->rchild);
}
}
voidlev_traverse(BiTreeT)
{//层序遍历
SqQueueq;
BiTreep;
p=T;
InitQueue(q);
EnQueue(q,p);
while(q.rear!
=q.front)
{
DeQueue(q,p);
cout<data;
if(p->lchild!
=NULL)
EnQueue(q,p->lchild);
if(p->rchild!
=NULL)
EnQueue(q,p->rchild);
}
}
intleaf(BiTreeT)//求二叉树的叶子数
{
if(T==NULL)
return0;
else
{if(T->lchild==NULL&&T->rchild==NULL)
return1;
else
returnleaf(T->lchild)+leaf(T->rchild);
}
}
voidmenu(void)//主菜单
{
system("cls");
cout<<"\n\n";
cout<<"\t\t\t二叉树的简单应用\n";
cout<<"\t\t\t************************\n";
cout<<"\t\t\t**\n";
cout<<"\t\t\t*[1]建树*\n";
cout<<"\t\t\t*[2]层次遍历*\n";
cout<<"\t\t\t*[3]先序遍历*\n";
cout<<"\t\t\t*[4]中序遍历*\n";
cout<<"\t\t\t*[5]后序遍历*\n";
cout<<"\t\t\t*[6]求叶子数*\n";
cout<<"\t\t\t*[7]退出*\n";
cout<<"\t\t\t**\n";
cout<<"\t\t\t************************\n";
cout<<"\t\t\t请输入你的选项(1-7):
";
}
voidmain()
{
BiTreetree;
SqStackS;
intm,n,i;
while
(1)
{
menu();
cin>>i;
switch(i)
{
case1:
cout<<"请输入建立二叉链表的序列:
\n";
CreateBiTree(tree);
cout<break;
case2:
cout<<"所建立的二叉链表先序序列:
\n";
PreOrderTraverse(tree);
cout<break;
case3:
cout<<"所建立的二叉链表中序序列:
\n";
InOrderTraverse(tree);
cout<break;
case4:
cout<<"所建立的二叉链表层序遍历:
\n";
lev_traverse(tree);
cout<break;
case5:
cout<<"所建立的二叉链表后序序列:
\n";
PostOrderTraverse(tree);
cout<break;
case6:
cout<<"所建立的二叉链表的叶子数为:
\n";
m=leaf(tree);
cout<cout<case7:
exit(0);break;
default:
cout<<"输入错误,请输入(1-7):
\n";break;
}
cout<<"按回车键继续....\n";
getchar();
getchar();
}
}
七、测试情况
八、设计体会
通过这次课程设计,我进一步地了解了二叉树的算法思想,熟悉了递归运算的方法,以及如何提高c++编程的性能等等,初步掌握了建立二叉树并进行二叉树基本运算的方法和技术,通过动手操作,使我对理论的学习掌握得更好。
课程设计的过程,让我收获很多,从理论到实践,让我学到很多很多的东西,不仅可以巩固学过的知识,而且拓展了自己的知识面。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,但坚持下去不断努力,总能有所收获。
参考文献
[1]严蔚敏,李冬梅等.《数据结构实验教程(C语言版)》.北京:
人民邮电出版社,2010.