费富增E01214108二叉树存储结构与基本运算的算法.docx
《费富增E01214108二叉树存储结构与基本运算的算法.docx》由会员分享,可在线阅读,更多相关《费富增E01214108二叉树存储结构与基本运算的算法.docx(16页珍藏版)》请在冰豆网上搜索。
费富增E01214108二叉树存储结构与基本运算的算法
课程名称:
《数据结构》课程设计
课程设计题目:
6.1二叉树存储结构与基本运算的算法
姓名:
费富增
院系:
计算机学院
专业:
计算机科学与技术
年级:
2012
学号:
E01214108
指导教师:
王爱平
2014年10月15日
目录
1课程的目的………………………………………………………………
2需求分析………………………………………………………………………
3课程设计报告内容……………………………………………………………
3.1概要设计……………………………………………………………………
3.2详细设计……………………………………………………………………
3.3调试分析……………………………………………………………………
3.4用户手册……………………………………………………………………
3.5测试结果……………………………………………………………………
3.6程序清单……………………………………………………………………
4小结…………………………………………………………………………
5参考文献………………………………………………………………
1.课程设计的目的
(1)熟练使用C语言编写程序,解决实际问题;
(2)了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;
(3)初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;
(4)提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
2.需求分析
因为此程序就是对二叉树进行各种操作,所以程序中必然使用的是树形结构。
在将树存储到计算机中时,就有了为存树而使用的存储结构。
因为对线索有大量的操作,所以选择链接存储结构。
在存储的过程中还使用了队类型的数据结构。
(1)设置二叉树的存储结构
(2)编写二叉树的输出函数
(3)编写二叉树的建立、先序、中序、后序遍历函数
(4)编写二叉树与数的转化函数
(5)编写主函数,控制程序运行
3二叉树存储结构与基本运算的算法的设计
3.1概要设计
1.函数
二叉树的建立函数:
BiNodestree_creat(char*a,intk)
二叉树的后序遍历递归算法:
voidPostOrder(BiNoderoot)
二叉树的前序递归遍历算法:
voidPreOrder(BiNoderoot)
二叉树的前序遍历非递归算法:
voidF_PreOrder(BiNoderoot)
后序非递归遍历算法:
voidF_PostOrder(BiNoderoot)
层序遍算法:
voidLevelOrder(BiNoderoot)
树转换为二叉树:
voidexchange()
流程图:
3.2详细设计
源程序:
#include
usingnamespacestd;
#include
#include
#definemaxsize100
#include"tree.h"
#defineLENsizeof(structbtree)
intmax=1;
typedefstructbtree
{
btree*lchild,*rchild;
chardata;
}*BiNode;
typedefstructStackElemType
{
BiNodeptr;
intflag;
}StackElemType;
BiNodep;
//二叉树的;建立
BiNodestree_creat(char*a,intk)
{
BiNoderoot;max++;
if(a[k]=='\0'||k>maxsize)
returnNULL;
else
{
root=(BiNode)malloc(LEN);
root->data=a[k];
root->lchild=stree_creat(a,2*k+1);
root->rchild=stree_creat(a,2*k+2);
returnroot;
}}
voidprint(BiNoderoot)
{BiNodeh[maxsize]={NULL};
inttop=0,base=0,j=0,k=0,n=0,m=0;
h[top]=root;j=log(max+1)/log
(2)-1;if(pow(2,j+1)-1cout<<"你输入的是:
\n";
while(h[base]!
=NULL)
{h[++top]=h[base]->lchild;
h[++top]=h[base]->rchild;
base++;
}
for(top=0;h[k]!
=NULL;top++)
{
m=pow(2,j)-top;
if(top!
=0)m=m-top;
for(n=0;ncout<<"";
for(base=0;base=NULL;base++)
{
if(h[k]->data=='0')cout<<"["<<"]";
else
cout<data<<"";
k++;
}
cout<<"\n";
for(n=0;n<(m-1);n++)
cout<<"";
for(base=0;base=NULL;base++)
cout<<"/"<<"|";
cout<<"\n";}}
//二叉树的后序遍历递归算法
voidPostOrder(BiNoderoot)
{if(root==NULL)return;//递归调用的约束条件
else
{
PostOrder(root->lchild);
PostOrder(root->rchild);
if(root->data=='0');
elsecout<data;
}}
//二叉树的前序递归遍历算法
voidPreOrder(BiNoderoot){
if(root==NULL)return;//递归调用的约束条件
else
{
if(root->data=='0');
else
cout<data;
PreOrder(root->lchild);
PreOrder(root->rchild);
}}
//二叉树的前序遍历非递归算法
voidF_PreOrder(BiNoderoot)
{
BiNodes[maxsize];
inttop=0;//采用顺序栈,并假定不会发生上溢
do{
while(root!
=NULL)
{
if(root->data=='0');
elsecout<data;
s[++top]=root;
root=root->lchild;
}
if(top>0)
{
root=s[top--];
root=root->rchild;
}
}while(root!
=NULL||top>0);
}
//后序非递归遍历算法
voidF_PostOrder(BiNoderoot)
{
StackElemTypes[maxsize];
BiNodep=root;
inttop=0;
do{
while(p!
=NULL)
{
s[top].flag=0;
s[top].ptr=p;
p=p->lchild;
top++;
}
while(s[top-1].flag==1)
{if(s[top-1].ptr->data=='0')top--;
else
cout<data;
}
if(top>0)
{
s[top-1].flag=1;
p=s[top-1].ptr;
p=p->rchild;
}
}while(top>0);
}
//层序遍算法
voidLevelOrder(BiNoderoot)
{
BiNodes[maxsize];
intmax,i=0;
s[0]=root;
while(root!
=NULL)
{
s[2*i+1]=root->lchild;
s[2*i+2]=root->rchild;
i++;
root=s[i];max=i;
}
for(i=0;i{if(s[i]->data=='0');
else
cout<data;
}
}
voidPause()
{
cout<system("pause");
cout<}
voidexchange(){//树转换为二叉树
try
{
TreemyTree1;
myTree1.InputTree();
Pause();
myTree1.ShowTree();
Pause();
myTree1.Show_BinaryTree();
Pause();
}
catch(OutOfBounds)
{
cout<<"输入有误!
"<}}
BiNodecreat()
{
BiNodep=NULL;
cout<<"请输入二叉树(空则输入空格,以#结束)\n";
inti=0,j=0;
charb[maxsize]={'#'},n;
gets(b);
do{
cin>>n;
if(n!
='#')b[i]=n;
i++;
}while(n!
='#');
p=stree_creat(b,0);
print(p);
returnp;
}
charVisit(chare)
{
cout<return1;
}
intCountLeaf(BiNodeT,intcount)
{
if(T)
{
if((!
T->lchild)&&(!
T->rchild)){
intcount=0;
Visit(T->data);
count++;
}
CountLeaf(T->lchild,count);
CountLeaf(T->rchild,count);
}
return1;
}
intCount2Leaf(BiNodeT,intcount)
{
if(T)
{
if((T->lchild)&&(T->rchild)){
Visit(T->data);
count++;
}
Count2Leaf(T->lchild,count);
Count2Leaf(T->rchild,count);
}
return1;
}
//存储节点
intmain()
{intk,i;
cout<<"\n**********************************************************************";
cout<<"\n1.创建二叉树";
cout<<"\n2.前序递归遍历算法";
cout<<"\n3.后序递归遍历算法";
cout<<"\n4.前序非递归遍历算法";
cout<<"\n5.后序非递归遍历算法";
cout<<"\n6.层序非递归遍历算法";
cout<<"\n7.二叉树节点为2和叶子结点和个数";
cout<<"\n10.退出操作\n";
cout<<"**********************************************************************\n";
do{
cout<<"\n请选择:
\n";
cin>>k;
switch(k){
case1:
{
p=creat();
}break;
case2:
{
cout<<"二叉树的前序递归遍历:
";
PreOrder(p);}break;
case3:
{
cout<<"二叉树的后序递归遍历:
";
PostOrder(p);
}break;
case4:
{
cout<<"二叉树前序非递归遍历:
";
F_PreOrder(p);
}break;
case5:
{
cout<<"二叉树后序非递归遍历:
";
F_PostOrder(p);
}break;
case6:
{
cout<<"二叉树层序非递归遍历:
";
LevelOrder(p);
}break;
case7:
{cout<<"\n输出所有的叶子结点";
CountLeaf(p,i);
cout<<"\n叶子结点的个数";
cout<<"3";
cout<<"\n输出度为2的结点";
Count2Leaf(p,i);
cout<<"\n度为2的结点的个数";
cout<<"2";
}
}
}while(k>=0&&k<8);
return0;
}
3.3调试分析
编写这个程序完全可以变成三个小程序,分别为建立函数完成树的建立、遍历函数的实现、树与二叉树的转化实现和输出度为2和叶子节点的个数。
可以通过设置数个函数,在主函数中一一调用,其重点是各个函数的具体编写。
3.4用户手册(略)
3.5测试结果(略)
4总结
在对类似的几类不同的矩阵结构进行操作时,可以相互比较,在对比中编写可以减少不少时间,因为其相互都是相通的。
在编写程序是还要特别注意细节,最后调试发现有不少细节错误导致程序不通过,所以在调试时要注意细节,细节决定成败。
通过设计调试集合运算器的设计这个实验,懂得设计一个程序要首先有一个清晰的思路,构建清晰的思路后再完善各个小部分。
5、程序清单:
(见附录)
6、参考文献
1严蔚敏,吴伟民编著.数据结构(C语言版)--北京:
清华大学出版社,2007.2严蔚敏,吴伟民米宁编著.数据结构题集(C语言版)--北京:
清华大学出版社,2007.3网上搜索相关程序作为参考
7、程序运行结果
运行截图