数据结构c语言课设二叉树排序 2Word文档格式.docx
- 文档编号:20644123
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:19
- 大小:76.21KB
数据结构c语言课设二叉树排序 2Word文档格式.docx
《数据结构c语言课设二叉树排序 2Word文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构c语言课设二叉树排序 2Word文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
T=NULL;
}
//查找关键字,指针p返回
intSearchBST(BiTreeT,KeyTypekey,BiTreef,BiTree&
p)
if(!
p=f;
returnFALSE;
elseifEQ(key,T->
data.key)
p=T;
returnTRUE;
elseifLT(key,T->
returnSearchBST(T->
lchild,key,T,p);
else
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("
}
else
printf("
输入数据重复!
return;
插入
intInsertBST(BiTree&
T,ElemTypee)
BiTrees,p;
SearchBST(T,e.key,NULL,p))
s=(BiTree)malloc(sizeof(BiTNode));
s->
data=e;
lchild=s->
T=s;
elseifLT(e.key,p->
p->
lchild=s;
rchild=s;
elsereturnFALSE;
删除
//某个节点元素的删除
intDeleteEle(BiTree&
BiTreeq,s;
p->
rchild)//右子树为空
q=p;
p=p->
lchild;
free(q);
elseif(!
lchild)//左子树为空
rchild;
s=p->
while(s->
rchild)
q=s;
s=s->
p->
data=s->
data;
if(q!
=p)
q->
rchild=s->
deletes;
returnTRUE;
//整棵树的删除
intDeleteBST(BiTree&
T,KeyTypekey)//实现二叉排序树的删除操作
if(EQ(key,T->
data.key))//是否相等
returnDeleteEle(T);
elseif(LT(key,T->
data.key))//是否小于
returnDeleteBST(T->
lchild,key);
rchild,key);
2.2.3二叉树的前中后根遍历
栈的定义
typedefstruct
SElemType*base;
SElemType*top;
intstacksize;
}SqStack;
intInitStack(SqStack&
S)//构造空栈
S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
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));
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
*S.top++=e;
}//Push
intPop(SqStack&
S,SElemType&
e)//删除栈顶,应用e返回其值
if(S.top==S.base)returnERROR;
e=*--S.top;
}//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->
Pop(S,p);
中根遍历
intInOrderTraverse(BiTreeT,int(*Visit)(ElemTypee))
后根遍历
intPostOrderTraverse(BiTreeT,int(*Visit)(ElemTypee))
SqStackS,SS;
InitStack(SS);
Push(SS,p);
{
Pop(S,p);
p=p->
}
while(!
StackEmpty(SS))
Pop(SS,p);
2.2.4利用数组存储一个班学生信息
ElemTypea[]={51,"
陈继真"
88,
82,"
黄景元"
89,
53,"
贾成"
44,"
呼颜"
90,
25,"
鲁修德"
56,"
须成"
47,"
孙祥"
87,
38,"
柏有患"
9,"
革高"
10,"
考鬲"
31,"
李燧"
86,
12,"
夏祥"
余惠"
84,
4,"
鲁芝"
75,"
黄丙庆"
16,"
李应"
87,"
杨志"
18,"
李逵"
阮小五"
85,
20,"
史进"
21,"
秦明"
杨雄"
23,"
刘唐"
64,"
武松"
李俊"
86,"
卢俊义"
27,"
华荣"
28,"
杨胜"
29,"
林冲"
70,"
李跃"
蓝虎"
32,"
宋禄"
73,"
鲁智深"
34,"
关斌"
55,"
龚成"
36,"
黄乌"
57,"
孔道灵"
张焕"
59,"
李信"
30,"
徐山"
83,
41,"
秦祥"
42,"
葛公"
武衍公"
94,"
范斌"
45,"
60,
67,"
叶景昌"
99,
7,"
焦龙"
78,"
星姚烨"
49,"
孙吉"
60,"
陈梦庚"
95,
};
2.2.5数组查询函数
voidArraySearch(ElemTypea[],intkey,intlength){
i<
=length;
i++){
if(key==a[i].key){
cout<
<
"
学号:
"
<
a[i].key<
姓名:
a[i].name<
成绩:
a[i].grade<
endl;
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);
二叉排序树树形输出为:
DispalyBST(BT,nlayer);
请输入插入的元素:
e.key);
InsertBST(BT,e);
请输入删除的元素:
d.key);
DeleteBST(BT,d.key);
先序遍历为:
PreOrderTraverse(BT,Visit);
\n中序遍历为:
InOrderTraverse(BT,Visit);
\n后序遍历为:
PostOrderTraverse(BT,Visit);
XX文库-让每个人平等地提升自我ClearBiTree(BT);
\n二叉排序树已清空.\n"
DestroyBiTree(BT);
\n二叉排序树已销毁.\n"
system("
pause"
3.1.2测试结果截图
3.2对比二叉排序树查询和数组查询的效率
3.2.1测试主函数
intnlayer,key,length;
clock_tstart,finish;
doubleduration;
ElemTypea[]={51,"
length=sizeof(a)/sizeof(a[0]);
CreateBST(BT,p,a,length);
//树形显示二叉排序树
ShowBST(BT,nlayer);
while
(1){
printf("
请输入需要查找的学生学号:
cin>
>
key;
key)
//通过二叉树搜索记录
start=clock();
SearchBST(BT,key,NULL,p);
cout<
p->
data.key<
data.name<
data.grade<
finish=clock();
duration=(double)(finish-start)/CLOCKS_PER_SEC;
二叉树查询时间:
duration<
//通过数组搜索记录
ArraySearch(a,key,length);
数组查询时间:
3.2.2测试结果截图
3.2.3结论:
经过三次查询可以看出,二叉树的查找效率要高于数组。
当二叉排序树为满二叉树时,树的查找效率最高,因为二叉排序树的平均查找长度和logn是等数量级的,树的深度越小,查找效率越高。
因此,要提高二叉排序树的查找效率,可以将二叉排序树转变为平衡二叉树。
4总结与改进
4.1总结
通过这次课程设计将栈、链表等基本数据结构和一起实现了一遍,并且了解到,不同数据结构的查找效率是不同的,在选择算法时,不仅要考虑算法实现的难易程度,还要考虑它的效率。
在这次课设中也暴露出了平时练习的不足,自身的编程能力不强,本次很多代码都是参看大神博客直接拿来用的,调bug的时候经常无从入手,需要舍友的帮忙。
编程还是要多练习,看懂理论跟真的实现出来还有很长的距离,理论要应用于实践才能出真知。
4.2改进
改进成平衡二叉树效率可能更高
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构c语言课设二叉树排序 数据结构 语言 二叉 排序