精选在二叉排序树中查找关键字为key的记录资料Word格式.docx
《精选在二叉排序树中查找关键字为key的记录资料Word格式.docx》由会员分享,可在线阅读,更多相关《精选在二叉排序树中查找关键字为key的记录资料Word格式.docx(10页珍藏版)》请在冰豆网上搜索。
否则,将key与根节点的关键字比较:
若key=根节点的关键字,查找成功;
若key<
根节点的关键字,继续在左子树中查找;
若key>
根节点的关键字,继续在右子树中查找。
[参考源程序]
#include<
malloc.h>
stdio.h>
#defineNULL0
typedefintKeyType;
typedefstruct{
KeyTypekey;
}ElemType;
//元素类型
typedefstructBiTNode{
ElemTypedata;
structBiTNode*lchild,*rchild;
}BiTNode,*BiTree;
BiTreesearchBST(BiTreebt,KeyTypekey){
/*在二叉排序树bt中查找其关键字等于给定值的结点是否存在,并输出相应信息*/
if(bt==NULL)returnNULL;
//在排序二叉树中进行递归查找
elseif(bt->
data.key==key)returnbt;
elseif(key<
bt->
data.key)returnsearchBST(bt->
lchild,key);
elsereturnsearchBST(bt->
rchild,key);
}
voidinsertBST(BiTree*bt,BiTrees){
/*在二叉排序树中插入一个新结点,即依次插入输入的数*/
if(*bt==NULL)*bt=s;
elseif(s->
data.key<
(*bt)->
data.key)insertBST(&
((*bt)->
lchild),s);
data.key>
rchild),s);
main(){
charch;
BiTreebt,s;
inti=0;
/*建立一棵二叉排序树,元素从键盘按先序输入,直到输入关键字等于-1为止*/
printf("
\n请输入元素(-1:
结束):
\n"
);
//以-1为结束
scanf("
%d"
&
key);
bt=NULL;
while(key!
=-1){
s=(BiTree)malloc(sizeof(BiTNode));
(s->
data).key=key;
s->
lchild=s->
rchild=NULL;
insertBST(&
bt,s);
}//while
/*二叉排序树的查找,可多次查找,并输出查找的结果*/
do{
\n输入你想要查找的元素:
"
s=searchBST(bt,key);
if(s!
=NULL)printf("
\n成功!
这个等价元素是%d.\n"
s->
data.key);
elseprintf("
\n没有找到!
\n是否继续?
(y/n):
%c"
ch);
ch=getchar();
}
while(ch=='
y'
||ch=='
Y'
);
getchar();
}//main
实验结果:
五、实验结果与分析
(2)习题1:
采用先序遍历的方式生成二叉树,程序中多次使用的递归的算法。
使程序看起来很简洁。
如果把头结点的生成也放到生成树的函数中,会使程序看起来更加调理。
六、实验心得及体会
查找是很多程序的基础,很多程序中都会用到查找。
比如在线性表的插入和删除时要查找合适的位置。
所以学好查找是很必要的。
本次实验只要是采取了这般查找的方法。
其实还有很多查找的方法。
如顺序查找,索引顺序表查找。
每种查找方法各有优劣。
如折半查找的平均查找长度小于顺序查找,但它要求查找的表为有序的。
所以需将无序表排序成有序表。
这又会浪费运行时间。
编写程序时遇到了很多的困难,如先序生成树更好还是中序生成更好。
太原理工大学学生实验报告
计算机科学与技术
计Z1002班
郑海兵
2010001420
1月2日
5内排序
通过本次实验,掌握线性表的排序方法,并分析时间复杂度。
设计一个用链表表示的直接选择排序算法,并用程序实现。
n个数据。
n个数据由小到大排列的结果。
待排序记录顺序存储。
已知待排序初始序列用单链表存储,头指针head指向第一个结点,从这个待排序列中找出最小结点,插入head之后,用r来指示。
r以前为已排序序列,r以后为未排序序列。
再从未排序序列中找出最小结点插入r的后面,让r指向这个结点。
反复执行这个过程,直到排好序。
#include<
intn;
structNumber{
intdata;
structNumber*next;
};
structNumber*Creat_H(intk){//创建单链表
structNumber*L;
structNumber*p;
p=(structNumber*)malloc(sizeof(structNumber));
L=p;
inttemp;
inti;
printf("
\n请输入元素:
for(i=1;
i<
=k;
i++){
scanf("
temp);
p->
data=temp;
if(i==k){
next=NULL;
break;
next=(structNumber*)malloc(sizeof(structNumber));
p=p->
next;
}//for
returnL;
}//structNumber*Creat_H
structNumber*Sort(structNumber*p){//直接选择排序
structNumber*max;
structNumber*min;
structNumber*temp;
structNumber*r;
r=p;
intflag=0;
do{
if(flag==0){//第一次找最小数时的初始化
temp=min=max=r;
else{
temp=min=max=r->
}//do
while
(1){//找出最小数
if(min->
data<
=max->
next->
data){
if(max->
next!
=NULL){
max=max->
}//if
temp=max;
//相当于temp->
next=min
min=max->
}//else
}//while
(1)
if(temp!
=min){
next==NULL){
temp->
next=min->
if(flag==0){
r=min;
r->
next=p;
p=r;
min->
next=r->
next=min;
else{//初始化时min就已经指向了最小数
if(flag==0){//第一次找到最小数
The鐗╄祫鍗忎綔
The鎷嗙鎶?
flag++;
//又排好一个数
TheCongplay珛Luㄦ潈if(flag==n-1){
The鍙楁硶Huan嬩繚鎶?
returnp;
The鎶mat娂鏉冮"
Wan?
}while
(1);
The鐗╂祦鍙mixstosplash}
The鐗╄祫Cong″垝intmain(){
The鑸Gui姟Xig悊structNumber*H;
\n请输入元素个数n(n>
=2):
//输入数据(不得少于2个)
n);
Doesthe鍗曠嫭鎷栬splashChan?
while(n<
2){
\nError!
请重新输入元素个数n:
TheLu墿Juan績}
H=Creat_H(n);
H=Sort(H);
\n排序后的数为:
//数据排序后的序列
while(H!
%-4d"
H->
data);
H=H->
system("
pause"
return0;
getchar();
习题1:
这题要从前面和后面同时进行处理,只有这样才能保证时间复杂度为O(N)。
排序有很多种方法,如冒泡排序、直接插入排序、希尔排序、归并排序、选择排序等等。
各个排序的方法各有优劣,时间复杂度各不相同。
习题二中使用的快速排序方法是冒泡排序的改进方法,时间复杂度比较小。
但若初始纪录序列按关键字有序或基本有序时,快速排序退化为冒泡排序。
在实验中学习到很多,每次调试程序都进步不少,以后会多思考,多读程序,使思维更加缜密,调理和清晰,同时也提高自己的提高动手能力。