typedef struct{ //查找表的数据结构
ElemType *elem; //存储空间基址,建表时按实际长度分配,0号留空
int length; //表的长度
} SSTable;
int BinSearchRec(SSTable ST, ElemType key, int low, int high){
if(low>high)
return 0;
mid=(low+high)/2; //取中间位置
if(key>ST.elem[mid]) //向后半部分查找
BinSearchRec(ST,key,mid+1,high);
else if(key<ST.elem[mid]) //向前半部分查找
BinSearchRec(ST,key,low,mid-1);
else //查找成功
return mid;
}
int SeqSrch(RcdType R[], ElemType k) {
//顺序查找线性表,找到后和其前面的元素交换
int i=0;
while ((R[i].key !=k) && (i<n))
i++; //从前向后顺序查找指定结点
if (i<n&&i>0) { //若找到,则交换
temp=R[i]; R[i]=R[i-1]; R[i-1]=temp;
return --i; //交换成功,返回交换后的位置
}
else return -1; //交换失败
}
bool findkey(int A[][], int n, int k) {
int i=0, j=n-1;
while (i<n&&j>=0) { //离开边界时查找结束
if (A[i][j]==k) return true; //查找成功
else if (A[i][j]>k) j--; //向左移动,在该行内寻找目标值
else i++; //向下移动,查找下一个更大的元素
}
return false; //查找失败
}
比较次数不超过2n次,时间复杂度为O(n);空间复杂度为O(1)。
KeyType predt=-32767; //predt 为全局变量,保存当前结点中序前驱的值,初值为-∞
int JudgeBST(BiTree bt) {
int b1,b2;
if(bt==NULL) //空树
return 1;
else{
b1=JudgeBST(bt->lchild); //判断左子树是否是二叉排序树
if(b1==0||predt>=bt->data) //若左子树返回值为 0 或前驱大于或等于当前结点
return 0; //则不是二叉排序树
predt=bt->data; //保存当前结点的关键字
b2=JudgeBST(bt->rchild); //判断右子树
return b2; //返回右子树的结果
}
}
int level(BiTree bt,BSTNode *p){
int n=0; //统计查找次数
BiTree t=bt;
if(bt!=NULL){
n++;
}
while (t->data!=p->data) {
if (p->data<t->data) //在左子树中查找
t=t->lchild;
else
t=t->rchild; //在右子树中查找
n++; //层次加 1
}
return n;
}
void Judge_AVL(BiTree bt, int &balance, int &h) {
int bl=0, br=0, hl=0, hr=0; //左、右子树的平衡标记和高度
if (bt==NULL) { //空树,高度为 0
h=0;
balance=1;
}
else if (bt->lchild==NULL&&bt->rchild==NULL) { //仅有根结点,则高度为 1
h=1;
balance=1;
}
else {
Judge_AVL(bt->lchild, bl, hl); //递归判断左子树
Judge_AVL(bt->rchild, br, hr); //递归判断右子树
h=(hl>hr?hl:hr)+1;
if (abs(hl-hr)<2) //若子树高度差的绝对值<2,则看左、右子树是否都平衡
balance=bl&&br; //&&为逻辑与,即左、右子树都平衡时,二叉树平衡
else
balance=0;
}
}
KeyType MinKey(BSTNode *bt) {
while (bt->lchild!=NULL)
bt=bt->lchild;
return bt->data;
}
KeyType MaxKey(BSTNode *bt) {
//求出二叉排序树中最大关键字结点
while (bt->rchild!=NULL)
bt=bt->rchild;
return bt->data;
}
void Output(BSTNode *bt, KeyType k) {
//本算法从大到小输出二叉排序树中所有值不小于k的关键字
if (bt==NULL)
return;
if (bt->rchild!=NULL)
Output(bt->rchild, k); //递归输出右子树结点
if (bt->data>=k)
printf("%d", bt->data); //只输出大于或等于k的结点值
if (bt->lchild!=NULL)
Output(bt->lchild, k); //递归输出左子树的结点
}
BSTNode *Search_Small(BSTNode*t, int k) {
//在以t为根的子树上寻找第k小的元素,返回其所在结点的指针。k从1开始计算
//在树结点中增加一个count数据成员,存储以该结点为根的子树的结点个数
if(k<1||k>t->count) return NULL;
if(t->lchild==NULL) {
if(k==1) return t;
else return Search_Small(t->rchild,k-1);
}
else{
if(t->lchild->count==k-1) return t;
if(t->lchild->count>k-1) return Search_Small(t->lchild,k);
if(t->lchild->count<k-1)
return Search_Small(t->rchild, k-(t->lchild->count+1));
}
}