费富增E01214108二叉树存储结构与基本运算的算法.docx

上传人:b****7 文档编号:26521395 上传时间:2023-06-20 格式:DOCX 页数:16 大小:103.03KB
下载 相关 举报
费富增E01214108二叉树存储结构与基本运算的算法.docx_第1页
第1页 / 共16页
费富增E01214108二叉树存储结构与基本运算的算法.docx_第2页
第2页 / 共16页
费富增E01214108二叉树存储结构与基本运算的算法.docx_第3页
第3页 / 共16页
费富增E01214108二叉树存储结构与基本运算的算法.docx_第4页
第4页 / 共16页
费富增E01214108二叉树存储结构与基本运算的算法.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

费富增E01214108二叉树存储结构与基本运算的算法.docx

《费富增E01214108二叉树存储结构与基本运算的算法.docx》由会员分享,可在线阅读,更多相关《费富增E01214108二叉树存储结构与基本运算的算法.docx(16页珍藏版)》请在冰豆网上搜索。

费富增E01214108二叉树存储结构与基本运算的算法.docx

费富增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<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、程序运行结果

运行截图

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 节日庆典

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1