数据结构C语言课设二叉树排序.docx

上传人:b****4 文档编号:24636175 上传时间:2023-05-29 格式:DOCX 页数:22 大小:76.10KB
下载 相关 举报
数据结构C语言课设二叉树排序.docx_第1页
第1页 / 共22页
数据结构C语言课设二叉树排序.docx_第2页
第2页 / 共22页
数据结构C语言课设二叉树排序.docx_第3页
第3页 / 共22页
数据结构C语言课设二叉树排序.docx_第4页
第4页 / 共22页
数据结构C语言课设二叉树排序.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

数据结构C语言课设二叉树排序.docx

《数据结构C语言课设二叉树排序.docx》由会员分享,可在线阅读,更多相关《数据结构C语言课设二叉树排序.docx(22页珍藏版)》请在冰豆网上搜索。

数据结构C语言课设二叉树排序.docx

数据结构C语言课设二叉树排序

题目:

二叉排序树的实现

1内容和要求

1)编程实现二叉排序树,包括生成、插入,删除;

2)对二叉排序树进行先根、中根、和后根非递归遍历;

3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上用树的形状表示出来。

4)分别用二叉排序树和数组去存储一个班(50人以上)的成员信息(至少包括学号、姓名、成绩3项),对比查找效率,并说明在什么情况下二叉排序树效率高,为什么?

2解决方案和关键代码

2.1解决方案:

先实现二叉排序树的生成、插入、删除,编写DisplayBST函数把遍历结果用树的形状表示出来。

前中后根遍历需要用到栈的数据结构,分模块编写栈与遍历代码。

要求对比二叉排序树和数组的查找效率,首先建立一个数组存储一个班的成员信息,分别用二叉树和数组查找,利用clock()函数记录查找时间来对比查找效率。

2.2关键代码

2.2.1树的基本结构定义及基本函数

typedefstruct

{

KeyTypekey;

}ElemType;

typedefstructBiTNode//定义链表

{

ElemTypedata;

structBiTNode*lchild,*rchild;

}BiTNode,*BiTree,*SElemType;

 

//销毁树

intDestroyBiTree(BiTree&T)

{

if(T!

=NULL)

free(T);

return0;

}

//清空树

intClearBiTree(BiTree&T)

{

if(T!

=NULL)

{

T->lchild=NULL;

T->rchild=NULL;

T=NULL;

}

return0;

}

//查找关键字,指针p返回

intSearchBST(BiTreeT,KeyTypekey,BiTreef,BiTree&p)

{

if(!

T)

{

p=f;

returnFALSE;

}

elseifEQ(key,T->data.key)

{

p=T;

returnTRUE;

}

elseifLT(key,T->data.key)

returnSearchBST(T->lchild,key,T,p);

else

returnSearchBST(T->rchild,key,T,p);

}

2.2.2二叉树的生成、插入,删除

生成

voidCreateBST(BiTree&BT,BiTreep)

{

inti;

ElemTypek;

printf("请输入元素值以创建排序二叉树:

\n");

scanf_s("%d",&k.key);

for(i=0;k.key!

=NULL;i++)

{

//判断是否重复

if(!

SearchBST(BT,k.key,NULL,p))

{

InsertBST(BT,k);

scanf_s("%d",&k.key);

}

else

{

printf("输入数据重复!

\n");

return;

}

}

}

插入

intInsertBST(BiTree&T,ElemTypee)

{

BiTrees,p;

if(!

SearchBST(T,e.key,NULL,p))

{

s=(BiTree)malloc(sizeof(BiTNode));

s->data=e;

s->lchild=s->rchild=NULL;

if(!

p)

T=s;

elseifLT(e.key,p->data.key)

p->lchild=s;

else

p->rchild=s;

returnTRUE;

}

elsereturnFALSE;

}

删除

//某个节点元素的删除

intDeleteEle(BiTree&p)

{

BiTreeq,s;

if(!

p->rchild)//右子树为空

{

q=p;

p=p->lchild;

free(q);

}

elseif(!

p->lchild)//左子树为空

{

q=p;

p=p->rchild;

free(q);

}

else

{

q=p;

s=p->lchild;

while(s->rchild)

{

q=s;

s=s->rchild;

}

p->data=s->data;

if(q!

=p)

q->rchild=s->lchild;

else

q->lchild=s->lchild;

deletes;

}

returnTRUE;

}

//整棵树的删除

intDeleteBST(BiTree&T,KeyTypekey)//实现二叉排序树的删除操作

{

if(!

T)

{

returnFALSE;

}

else

{

if(EQ(key,T->data.key))//是否相等

returnDeleteEle(T);

elseif(LT(key,T->data.key))//是否小于

returnDeleteBST(T->lchild,key);

else

returnDeleteBST(T->rchild,key);

}

return0;

}

2.2.3二叉树的前中后根遍历

栈的定义

typedefstruct

{

SElemType*base;

SElemType*top;

intstacksize;

}SqStack;

intInitStack(SqStack&S)//构造空栈

{

S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));

if(!

S.base)exit(OVERFLOW);

S.top=S.base;

S.stacksize=STACK_INIT_SIZE;

returnOK;

}//InitStack

intPush(SqStack&S,SElemTypee)//插入元素e为新栈顶

{

if(S.top-S.base>=S.stacksize)

{

S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));

if(!

S.base)exit(OVERFLOW);

S.top=S.base+S.stacksize;

S.stacksize+=STACKINCREMENT;

}

*S.top++=e;

returnOK;

}//Push

intPop(SqStack&S,SElemType&e)//删除栈顶,应用e返回其值

{

if(S.top==S.base)returnERROR;

e=*--S.top;

returnOK;

}//Pop

intStackEmpty(SqStackS)//判断是否为空栈

{

if(S.base==S.top)returnTRUE;

returnFALSE;

}

先根遍历

intPreOrderTraverse(BiTreeT,int(*Visit)(ElemTypee))

{

SqStackS;

BiTreep;

InitStack(S);

p=T;

while(p||!

StackEmpty(S))

{

if(p)

{

Push(S,p);

if(!

Visit(p->data))returnERROR;

p=p->lchild;

}

else

{

Pop(S,p);

p=p->rchild;

}

}

returnOK;

}

中根遍历

intInOrderTraverse(BiTreeT,int(*Visit)(ElemTypee))

{

SqStackS;

BiTreep;

InitStack(S);

p=T;

while(p||!

StackEmpty(S))

{

if(p)

{

Push(S,p);

p=p->lchild;

}

else

{

Pop(S,p);

if(!

Visit(p->data))returnERROR;

p=p->rchild;

}

}

returnOK;

}

后根遍历

intPostOrderTraverse(BiTreeT,int(*Visit)(ElemTypee))

{

SqStackS,SS;

BiTreep;

InitStack(S);

InitStack(SS);

p=T;

while(p||!

StackEmpty(S))

{

if(p)

{

Push(S,p);

Push(SS,p);

p=p->rchild;

}

else

{

if(!

StackEmpty(S))

{

Pop(S,p);

p=p->lchild;

}

}

}

while(!

StackEmpty(SS))

{

Pop(SS,p);

if(!

Visit(p->data))returnERROR;

}

returnOK;

}

2.2.4利用数组存储一个班学生信息

ElemTypea[]={51,"陈继真",88,

82,"黄景元",89,

53,"贾成",88,

44,"呼颜",90,

25,"鲁修德",88,

56,"须成",88,

47,"孙祥",87,

38,"柏有患",89,

9,"革高",89,

10,"考鬲",87,

31,"李燧",86,

12,"夏祥",89,

53,"余惠",84,

4,"鲁芝",90,

75,"黄丙庆",88,

16,"李应",89,

87,"杨志",86,

18,"李逵",89,

9,"阮小五",85,

20,"史进",88,

21,"秦明",88,

82,"杨雄",89,

23,"刘唐",85,

64,"武松",88,

25,"李俊",88,

86,"卢俊义",88,

27,"华荣",87,

28,"杨胜",88,

29,"林冲",89,

70,"李跃",85,

31,"蓝虎",90,

32,"宋禄",84,

73,"鲁智深",89,

34,"关斌",90,

55,"龚成",87,

36,"黄乌",87,

57,"孔道灵",87,

38,"张焕",84,

59,"李信",88,

30,"徐山",83,

41,"秦祥",85,

42,"葛公",85,

23,"武衍公",87,

94,"范斌",83,

45,"黄乌",60,

67,"叶景昌",99,

7,"焦龙",89,

78,"星姚烨",85,

49,"孙吉",90,

60,"陈梦庚",95,

};

2.2.5数组查询函数

voidArraySearch(ElemTypea[],intkey,intlength){

inti;

for(i=0;i<=length;i++){

if(key==a[i].key){

cout<<"学号:

"<

"<

"<

break;

}

}

}

2.2.6二叉树查询函数

上文二叉树基本函数中的SearchBST()即为二叉树查询函数。

3数据测试与结果

3.1实现二叉树生成、插入、删除及前中后根遍历

3.1.1测试主函数

voidmain()

{

intnlayer;

BiTreeBT,p;

BT=NULL;

p=NULL;

nlayer=1;

ElemTypee,d;

CreateBST(BT,p);

printf("二叉排序树树形输出为:

\n");

DispalyBST(BT,nlayer);

printf("请输入插入的元素:

");

scanf_s("%d",&e.key);

InsertBST(BT,e);

printf("\n");

DispalyBST(BT,nlayer);

printf("请输入删除的元素:

");

scanf_s("%d",&d.key);

DeleteBST(BT,d.key);

printf("\n");

DispalyBST(BT,nlayer);

printf("先序遍历为:

");

PreOrderTraverse(BT,Visit);

printf("\n中序遍历为:

");

InOrderTraverse(BT,Visit);

printf("\n后序遍历为:

");

PostOrderTraverse(BT,Visit);

ClearBiTree(BT);

printf("\n二叉排序树已清空.\n");

DispalyBST(BT,nlayer);

DestroyBiTree(BT);

printf("\n二叉排序树已销毁.\n");

system("pause");

}

3.1.2测试结果截图

3.2对比二叉排序树查询和数组查询的效率

3.2.1测试主函数

voidmain()

{

intnlayer,key,length;

clock_tstart,finish;

BiTreeBT,p;

doubleduration;

BT=NULL;

p=NULL;

nlayer=1;

 

ElemTypea[]={51,"陈继真",88,

82,"黄景元",89,

53,"贾成",88,

44,"呼颜",90,

25,"鲁修德",88,

56,"须成",88,

47,"孙祥",87,

38,"柏有患",89,

9,"革高",89,

10,"考鬲",87,

31,"李燧",86,

12,"夏祥",89,

53,"余惠",84,

4,"鲁芝",90,

75,"黄丙庆",88,

16,"李应",89,

87,"杨志",86,

18,"李逵",89,

9,"阮小五",85,

20,"史进",88,

21,"秦明",88,

82,"杨雄",89,

23,"刘唐",85,

64,"武松",88,

25,"李俊",88,

86,"卢俊义",88,

27,"华荣",87,

28,"杨胜",88,

29,"林冲",89,

70,"李跃",85,

31,"蓝虎",90,

32,"宋禄",84,

73,"鲁智深",89,

34,"关斌",90,

55,"龚成",87,

36,"黄乌",87,

57,"孔道灵",87,

38,"张焕",84,

59,"李信",88,

30,"徐山",83,

41,"秦祥",85,

42,"葛公",85,

23,"武衍公",87,

94,"范斌",83,

45,"黄乌",60,

67,"叶景昌",99,

7,"焦龙",89,

78,"星姚烨",85,

49,"孙吉",90,

60,"陈梦庚",95,

};

length=sizeof(a)/sizeof(a[0]);

 

CreateBST(BT,p,a,length);

//树形显示二叉排序树

printf("二叉排序树树形输出为:

\n");

ShowBST(BT,nlayer);

 

while

(1){

printf("请输入需要查找的学生学号:

\n");

cin>>key;

if(!

key)

break;

//通过二叉树搜索记录

start=clock();

SearchBST(BT,key,NULL,p);

cout<<"学号:

"<data.key<<"姓名:

"<data.name<<"成绩:

"<data.grade<

finish=clock();

duration=(double)(finish-start)/CLOCKS_PER_SEC;

cout<<"二叉树查询时间:

"<

 

//通过数组搜索记录

start=clock();

ArraySearch(a,key,length);

finish=clock();

duration=(double)(finish-start)/CLOCKS_PER_SEC;

cout<<"数组查询时间:

"<

}

}

3.2.2测试结果截图

3.2.3结论:

经过三次查询可以看出,二叉树的查找效率要高于数组。

当二叉排序树为满二叉树时,树的查找效率最高,因为二叉排序树的平均查找长度和logn是等数量级的,树的深度越小,查找效率越高。

因此,要提高二叉排序树的查找效率,可以将二叉排序树转变为平衡二叉树。

4总结与改进

4.1总结

通过这次课程设计将栈、链表等基本数据结构和一起实现了一遍,并且了解到,不同数据结构的查找效率是不同的,在选择算法时,不仅要考虑算法实现的难易程度,还要考虑它的效率。

在这次课设中也暴露出了平时练习的不足,自身的编程能力不强,本次很多代码都是参看大神博客直接拿来用的,调bug的时候经常无从入手,需要舍友的帮忙。

编程还是要多练习,看懂理论跟真的实现出来还有很长的距离,理论要应用于实践才能出真知。

4.2改进

改进成平衡二叉树效率可能更高

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

当前位置:首页 > 高中教育 > 初中教育

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

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