typedef float KeyType;
typedef int KeyType;
typedef char *KeyType;
//---------------------顺序查找表的顺序存储结构------------------
typedef struct{
ElemType *elem; //数据元素存储空间基址,建表时按实际长度分配,0号单元留空
int length; //表长度
}SSTable;
//算法9.1
int Search_Seq(SSTable ST,KeyType key){
//在顺序表ST中顺序查找其关键字等于key的数据元素。
//若找到,则函数值为该元素在表中的位置,否则为0
ST.elem[0].key=key;
for(i=ST.length;!EQ(ST.elem[i].key,key),i--);//从后往前找
return i; //找不到时,i为0
}
//算法9.2
int Search_Bin(SSTable ST,KeyType key){
//在有序表ST中折半查找其关键字等于key的数据元素。
//若找到,则函数值为该元素在表中的位置,否则为0
low=1;
high=ST.length;
while(low<=high){
min=(low+high)/2;
if(EQ(key,ST.elem[mid].key))
return mid;
else if(LT(key,ST.elem[mid].key))
high=mid-1;
else
low=mid+1;
}
return 0;
}
//算法9.3
void SecondOptimal(BiTree &T,ElemType R[],float sw[].int low,int high){
//由有序表R[low..high]及其累计权值表sw(其中,sw[0]==0)递归构造次优查找树T
i=low;
min=abs(sw[high]-sw[low]);
dw=sw[high]+sw[low-1];
for(j=low+1;j<=high;j++)
if(abs(dw-sw[j]-sw[j-1])<min){
i=j;
min=abs(dw-sw[j]-sw[j-1]);
}
T=(BiTree)malloc(sizeof(BiTNode));
T->data=R[i];
if(i==low)
T->lchild=NULL;
else
SecondOptimal(T->lchild,R,sw,low,i-1);
if(i==high)
T->rchild=NULL;
else
SecondOptimal(T->rchild,R,sw,i+1,high);
}
//算法9.4
typedef BiTree SOSTree;
status CreateSOSTree(SOSTree &T,SSTable ST){
//由有序表ST构造一颗次优查找树T。ST的数据元素含有权域weight
if(ST.length==0)
T=NULL;
else{
FindSW(sw,ST);
SecondOpiamal(T,ST.elem,sw,1,ST.length);
}
return ok;
}
//算法9.5a
BiTree SearchBST(BiTree T,KeyType){
//在根指针T所指二叉排序树中递归递归的查找某关键字等于key的数据元素
//若查找成功,则返回指向该数据元素结点的指针,否则返回空指针
if((!T)||EQ(key,T->data.key))
return(T); //查找结束
else if(LT(key,T->data.key)
return (SearchBST(T->lchild,key)); //在左子树中继续查找
else
return (SearchBST(T->rchild,key)); //在右子树中继续查找
}
//算法9.5b
status SearchBST(BiTree T,KeyType key,BiTree f,BiTree &p){
//在根指针T所指二叉排序树中递归递归的查找某关键字等于key的数据元素
//若查找成功,则指针p指向该数据元素结点,并返回TRUE,否则指针p指向查找路径上访问的最后一个结点并返回FALSE
//指针f指向T的的双亲,其初始调用值为NULL
if(!T) {p=f;return false;}
else if EQ(key,T->data.key) {p=T;ruturn true;}
else if LT(key,T->data.key) return SearchBST(T->lchild,key,T,p);
else return SearchBST(T->rchild,key,T,p);
}
//算法9.6
status InsertBST(BiTree &T,ElemType e){
//当二叉排序树T中不存在关键字等于e.key的数据元素时,插入e并返回TRUE
//否则返回FALSE
if(!SearchBST(T,e.key.NULL,p){
s=(BiTree)malloc(sizeof(BiTNode));
s->data=e;
s->lchild=s->rchild=NULL;
if(!p)
T=s; //被插入结点*s为新的根节点
else if LT(e.key,p->data.key)
p->lchild=s; //被插入结点*s为左孩子
else p->rchild=s;
return true;
}
else
return flase;
}
数据结构伪C代码:9.查找
最新推荐文章于 2022-10-18 09:18:21 发布