费富增E01214108二叉树存储结构与基本运算的算法.docx
- 文档编号:26521395
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:16
- 大小:103.03KB
费富增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)-1 cout<<"你输入的是: \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;n cout<<""; for(base=0;base =NULL;base++) { if(h[k]->data=='0')cout<<"["<<"]"; else cout< 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< }} //二叉树的前序递归遍历算法 voidPreOrder(BiNoderoot){ if(root==NULL)return;//递归调用的约束条件 else { if(root->data=='0'); else cout< PreOrder(root->lchild); PreOrder(root->rchild); }} //二叉树的前序遍历非递归算法 voidF_PreOrder(BiNoderoot) { BiNodes[maxsize]; inttop=0;//采用顺序栈,并假定不会发生上溢 do{ while(root! =NULL) { if(root->data=='0'); elsecout< 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< } 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< } } voidPause() { cout< system("pause"); cout< } voidexchange(){//树转换为二叉树 try { Tree 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、程序运行结果 运行截图data;data;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 费富增 E01214108 二叉 存储 结构 基本 运算 算法