(4)B-树

B-树的常用操作。没有输入输出无法运行。

#include <iostream>
#define m 3//最多拥有三个节点,两个关键字。即三阶B-树 
typedef struct Record{
	int data;
}Record; 
typedef struct BTNode{
	int keyNum;//关键字数量。子树数量大一
	struct BTNode *parent;
	int key[m+1];
	struct BTNode *ptr[m+1];// 0用的。子树数量比关键字数量大1  
	Record *recptr[m+1];//同key,找到了关键字找对应的record 
};
typedef struct Result{
	BTNode *pt;//指向关键字所在节点 
	int i;//指示key或record的对应序号 
	int tag;//1查找成功 0查找失败 
}Result; 
int search(BTNode *T,int key){
	int t = 0;
	if(!T){
		return 0;
	}else {
		for(int i = 1;i <=5;i++){
			if(T->key[i] <= key) {
				t = i;
			}
		}
	}
	return t;
}
Result SearchBTree (BTNode *T,int k){
	BTNode *p = T;
	BTNode *q = NULL;;
	int i = 0;
	bool find = false;
	while (p && !find){
		i = search(T,k);
		if(i>0 && p->key[i] == k){
			find = true;
		}else{
			q = p; 
			p = p->ptr[i];
		}
	}
	if(find){
		Result re ;
		re.pt = p;
		re.i = i;
		re.tag = 1;
		return re;
	}else{
		Result re ;
		re.pt = p;
		re.i = i;
		re.tag = 0;
		return re;//失败时应插入key[]的第i号后面 
	}
}
//在节点中指定位置插入关键字。并补位ap 
void Insert(BTNode *q,int i,int x,BTNode *ap){
	i++;
	for(int j = m;j>i;j--){
		q->key[j-1] = q->key[j];
		q->ptr[j-1] = q->ptr[j];
	}
	q->key[i] = x;
	q->ptr[i] = ap;
	q->parent = q;
} 
//只适用m=3 
void split(BTNode *q,int s,BTNode *&ap){
	q->keyNum = 1;
	ap->keyNum = 1;
	ap->key[1] = q->key[3];
	ap->ptr[0] = q->ptr[2];
	ap->ptr[1] = q->ptr[3];
} 
void NewRoot(BTNode *&T,BTNode *q,int x,BTNode *ap){
	T = new BTNode;
	T->key[1] = x;
	T->keyNum = 1;
	T->parent = NULL;
	T->ptr[0] = q;
	T->ptr[1] = ap;
	q->parent = T;
	ap->parent = T;
}
//在指定节点插入关键字。如果节点过大则分割,向父节点插入节点。 
bool InsertBTree (BTNode *&T,int key,BTNode *q,int i){
	int x = key;//插入关键字的值 
	BTNode *ap = NULL;
	bool finished = false;
	while(q && !finished){
		Insert(q,i,x,ap);//将ap放在i的右边 
		if(q->keyNum < m) finished = true;
		else{
			int s = 2;//取m的中值
			split(q,s,ap);//将q按照s的位置,拆分成两个。并创建节点ap,只有一个关键字。两边连接s左右。
			x = q->key[s];//更新x 
			q = q->parent;//更新
			if(q) i = search(q,x);//修正i 
		} 
	}
	if(!finished){//T是空树说明需要重新生成根节点
		NewRoot(T,q,x,ap); 
	}
	return true; 
}
int main(){
	return 0;
} 
    原文作者:B树
    原文地址: https://blog.csdn.net/b_296884864/article/details/79231594
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞