1、 *insertbst(t, s) *s, *t; bstnode *f, *p;p=t;while(p! f=p;if (skey= =pkey) return t;if (skeypkey) p=plchild;else p=prchild; if(t= =Null) s;fkey) flchild=s;frchild=s;return *creatord( ) *t, * s; intt=Null;scanf(“%d”,&key);while (key!=0) s=malloc(sizeof (bitree);skey=key;slchild=Null;srchild=Null;scan
2、f(“%d”, &data);sother=data;t=insertbst(t, s); 五、思考与提高1. 用其它的查找方法完成该算法。2.比较各种算法的时间及空间复杂度。六、完整参考程序1.折半查找#include stdio.h#define MAX 30 /定义有序查找表的最大长度typedef struct char elemMAX; /有序查找表 int length; /length指示当前有序查找表的长度SSTable;void initial(SSTable &); /初始化有序查找表int search(SSTable,int); /在有序查找表中查找元素void pri
3、nt(SSTable); /显示有序查找表中所有元素void main()SSTable ST; /ST为一有序查找表 int ch,loc,flag=1; char j; initial(ST); while(flag) printf(请选择:n printf(1.显示所有元素n2.查找一个元素n3.退出n scanf( %c,&j); switch(j) case 1:print(ST); break; /显示所有元素 case 2printf(请输入要查找的元素: scanf(%dch); /输入要查找的元素的关键字 loc=search(ST,ch); /查找 if(loc!=0) p
4、rintf(该元素所在位置是:%dn,loc); /显示该元素位置 else printf(%d 不存在!,ch);/当前元素不存在 break; default:flag=0; 程序运行结束!按任意键退出!v)/初始化有序查找表 int i;请输入静态表的元素个数: /输入有序查找表初始化时的长度v.length);请从小到大输入%d个元素(整形数):,v.length); getchar(); for(i=1;i=v.length;i+) scanf(v.elemi); /从小到大输入有序查找表的各元素int search(SSTable v,int ch)/在有序查找表中查找ch的位置,
5、成功返回其位置,失败返回0 int low,high,mid; low=1;high=v.length; /置区间初值 while(lowch) high=mid-1; /继续在前半区间进行查找 else low=mid+1; /继续在后半区间进行查找 return 0; /找不到时,i为0void print(SSTable v) /显示当前有序查找表所有元素int i;i+) printf(%d ,v.elemi);2.二叉排序树的建立与查找math.hstdlib.henum BOOLFalse,True;typedef struct BiTNode /定义二叉树节点结构char dat
6、a; /为了方便,数据域只有关键字一项 struct BiTNode *lchild,*rchild; /左右孩子指针域BiTNode,*BiTree;BOOL SearchBST(BiTree,char,BiTree,BiTree& /在二叉排序树中查找元素BOOL InsertBST(BiTree &,char); /在二叉排序树中插入元素 BOOL DeleteBST(BiTree & /在二叉排序树中删除元素void Delete(BiTree & /删除二叉排序树的根结点void InorderBST(BiTree); /中序遍历二叉排序树,即从小到大显示各元素BiTree T,p;
7、 char ch,keyword,j=y; BOOL temp; T=NULL; while(j!=n) printf(1.displayn2.searchn3.insertn4.deleten5.exitn /输入操作选项 switch(ch)if(!T) printf(The BST has no elem.n else InorderBST(T);printf(Input the keyword of elem to be searched(a char):keyword); /输入要查找元素的关键字 temp=SearchBST(T,keyword,NULL,p); if(!temp)
8、 printf(%c isnt existed!,keyword); /没有找到%c has been found! /成功找到3Input the keyword of elem to be inserted(a char): /输入要插入元素的关键字 temp=InsertBST(T,keyword);%c has been existed! /该元素已经存在Sucess to inert %c! /成功插入4Input the keyword of elem to be deleted(a char): /输入要删除元素的关键字 temp=DeleteBST(T,keyword); /该
9、元素不存在Sucess to delete %cn /成功删除 default: j=The program is over!nPress any key to shut off the window!getchar();void InorderBST(BiTree T)/以中序方式遍历二叉排序树T,即从小到大显示二叉排序树的所有元素 if(T-lchild) InorderBST(T-lchild);%2c,T-rchild) InorderBST(T-rchild);BOOL SearchBST(BiTree T,char key,BiTree f,BiTree &p)/在根指针T所指二叉
10、排序树中递归的查找其关键字等于key的元素,若查找成功 /则指针p指向该数据元素,并返回True,否则指针指向查找路径上访问的最后一 /个结点并返回False,指针f指向T的双亲,其初始调用值为NULL BOOL tmp1,tmp2; tmp1=tmp2=False; if(!T) p=f;return False; /查找不成功 else if(key=T-data) p=T;return True; /查找成功 else if(keydata) tmp1=SearchBST(T-lchild,key,T,p); /在左子树中继续查找 else tmp2=SearchBST(T-rchild
11、,key,T,p); /在右子树中继续查找 if(tmp1|tmp2) return True; /若在子树中查找成功,向上级返回True else return False; /否则返回FalseT,char e)/当二叉排序树T中不存在元素e时,插入e并返回True,否则返回False BiTree p,s;SearchBST(T,e,NULL,p) /查找不成功 s=(BiTree)malloc(sizeof(BiTNode); s-data=e;lchild=s-rchild=NULL;p) T=s; /被插结点*s为新的根结点 else if(edata) p-lchild=s; /
12、被插结点*s为左孩子 else p-rchild=s; /被插结点*s为右孩子 return True; /树中已存在关键字为e的数据元素T,char key)/若二叉排序树T中存在关键字等于key的数据元素时,则删除该数据元素结点 /并返回True,否则返回FalseT) return False; /不存在关键字等于key的数据元素 else if(key=T-data) Delete(T); /找到关键字等于key的数据元素并删除它data) tmp1=DeleteBST(T-lchild,key); /继续在左子树中删除 else tmp2=DeleteBST(T-rchild,key
13、); /继续在右子树中删除 /在子树中删除成功,返回True /不存在该元素/在二叉排序树中删除结点p,并重接它的左或右子树 BiTree s,q;rchild) /右子树空,只需重接它的左子树 q=p; p=p-lchild; free(q); else if(!lchild) /左子树空,只需重接它的右子树rchild; else /左右子树均不空 s=p- while(s-rchild) q=s;s=s- /转左,然后向右走到尽头 p-data=s-data; /s指向被删结点的“前驱” if(q!=p) q-rchild=s- /重接*q的右子树 else q- /重接*q的左子树 free(s); (注:可编辑下载,若有不当之处,请指正,谢谢!
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1