精选在二叉排序树中查找关键字为key的记录资料Word格式.docx

上传人:b****4 文档编号:17740967 上传时间:2022-12-09 格式:DOCX 页数:10 大小:25.86KB
下载 相关 举报
精选在二叉排序树中查找关键字为key的记录资料Word格式.docx_第1页
第1页 / 共10页
精选在二叉排序树中查找关键字为key的记录资料Word格式.docx_第2页
第2页 / 共10页
精选在二叉排序树中查找关键字为key的记录资料Word格式.docx_第3页
第3页 / 共10页
精选在二叉排序树中查找关键字为key的记录资料Word格式.docx_第4页
第4页 / 共10页
精选在二叉排序树中查找关键字为key的记录资料Word格式.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

精选在二叉排序树中查找关键字为key的记录资料Word格式.docx

《精选在二叉排序树中查找关键字为key的记录资料Word格式.docx》由会员分享,可在线阅读,更多相关《精选在二叉排序树中查找关键字为key的记录资料Word格式.docx(10页珍藏版)》请在冰豆网上搜索。

精选在二叉排序树中查找关键字为key的记录资料Word格式.docx

否则,将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)。

排序有很多种方法,如冒泡排序、直接插入排序、希尔排序、归并排序、选择排序等等。

各个排序的方法各有优劣,时间复杂度各不相同。

习题二中使用的快速排序方法是冒泡排序的改进方法,时间复杂度比较小。

但若初始纪录序列按关键字有序或基本有序时,快速排序退化为冒泡排序。

在实验中学习到很多,每次调试程序都进步不少,以后会多思考,多读程序,使思维更加缜密,调理和清晰,同时也提高自己的提高动手能力。

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

当前位置:首页 > 人文社科 > 哲学历史

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

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