#include<iostream>
#include<vector>
#include<map>
#define MAX 10
using namespace std;
int t=3;
struct Tree_Node{
int n;
char key[MAX];
bool leaf;
Tree_Node *c[MAX+1];
Tree_Node(int number,bool leave):n(number),leaf(leave){}
void DISK_READ(){}
void DISK_WRITE(){}
};
struct Node {
Tree_Node *a=NULL;
int i;
Node(Tree_Node *b,int j):a(b),i(j){}
};
class B_TREE {
public:
Tree_Node *root;
B_TREE():root(NULL){}
Node *B_TREE_SEARCH(Tree_Node *x,char k);
void B_TREE_CREATE();
void B_TREE_SPLIT_CHILD(Tree_Node *x,int i,Tree_Node *y);
void B_TREE_INSERT_NOTFULL(Tree_Node *x,char k);
void B_TREE_INSERT(char k);
void B_TREE_DELETE(Tree_Node *x,char k);
void B_TREE_PRINT(Tree_Node *x);
};
Node *B_TREE::B_TREE_SEARCH(Tree_Node *x,char k) {
int i=1;
while(i<x->n && k>x->key[i]) {
i+=1;
}
if(i<=x->n &&k==x->key[i]) {
return new Node(x,i);
} else {
if(x->leaf){
return new Node(NULL,0);
} else {
x->c[i]->DISK_READ();
return B_TREE_SEARCH(x->c[i],k);
}
}
}
void B_TREE::B_TREE_CREATE() {
root=new Tree_Node(0,true);
root->DISK_WRITE();
}
void B_TREE::B_TREE_SPLIT_CHILD(Tree_Node *x,int i,Tree_Node *y) {
Tree_Node *z=NULL;
z=new Tree_Node(t-1,y->leaf);
for(int j=1;j<t;j++){
z->key[j]=y->key[j+t];
}
if(!y->leaf){
for(int j=1;j<=t;j++){
z->c[j]=y->c[j+t];
}
}
y->n=t-1;
for(int j=x->n+1;j>=i+1;j--) {
x->c[j+1]=x->c[j];
}
x->c[i+1]=z;
for(int j=x->n;j>=i;j--) {
x->key[j+1]=x->key[j];
}
x->key[i]=y->key[t];
x->n+=1;
x->DISK_WRITE();
y->DISK_WRITE();
z->DISK_WRITE();
}
void B_TREE::B_TREE_INSERT_NOTFULL(Tree_Node *x,char k){
int i=x->n;
if(x->leaf){
while(i>=1 && k<x->key[i]){
x->key[i+1]=x->key[i];
i=i-1;
}
x->key[i+1]=k;
x->n+=1;
x->DISK_WRITE();
} else {
while(i>=1 && k<x->key[i]) {
i=i-1;
}
i=i+1;
x->c[i]->DISK_READ();
if(x->c[i]->n==2*t-1) {
B_TREE_SPLIT_CHILD(x,i,x->c[i]);
if(k>x->key[i]){
i=i+1;
}
}
B_TREE_INSERT_NOTFULL(x->c[i],k);
}
}
void B_TREE::B_TREE_INSERT(char k) {
Tree_Node *r=root,*s;
if(r->n==2*t-1){
root = new Tree_Node(0,false);
root->c[1]=r;
B_TREE_SPLIT_CHILD(root,1,r);
B_TREE_INSERT_NOTFULL(root,k);
} else {
B_TREE_INSERT_NOTFULL(r,k);
}
}
void B_TREE::B_TREE_DELETE(Tree_Node *x, char k) {
int i, j;
for(i=1;i<=x->n;i++){
if(x->key[i]>=k)
break;
}
Tree_Node *y=x->c[i], *z = x->c[i+1], *d;
if(x->key[i]==k && i<=x->n) {
if(x->leaf) {
for(j=i;j<x->n;j++) {
x->key[j]=x->key[j+1];
}
x->n--;
return;
}
if(y->n>=t) {
d=y;
while(!d->leaf)
d = d->c[d->n+1];
x->key[i] = d->key[d->n];
B_TREE_DELETE(y, d->key[d->n]);
}
else if(z->n >= t) {
d = z;
while(d->leaf == false)
d = d->c[1];
x->key[i] = d->key[1];
B_TREE_DELETE(z, d->key[1]);
} else {
y->key[y->n+1] = k;
for(j = 1; j <= z->n; j++)
y->key[y->n+j+1] = z->key[j];
if(!y->leaf) {
for(j = 1; j <= z->n+1; j++)
y->c[y->n+j+1] = z->c[j];
}
y->n = y->n + 1 + z->n;
for(j = i; j < x->n; j++)
x->key[j] = x->key[j+1];
for(j = i+1; j <= x->n; j++)
x->c[j] = x->c[j+1];
x->n--;
if(x->n == 0 && root == x)
root = y;
delete z;
B_TREE_DELETE(y, k);
}
} else {
if(x->leaf) {
cout<<"error:not exist"<<endl;
return;
}
if(y->n == t-1) {
if(i <= x->n && z->n >= t) {
y->n++;
y->key[y->n] = x->key[i];
x->key[i] = z->key[1];
for(j = 1; j < z->n; j++)
z->key[j] = z->key[j+1];
if(!y->leaf) {
y->c[y->n+1] = z->c[1];
for(j = 1; j <= z->n; j++)
z->c[j] = z->c[j+1];
}
z->n--;
}
else if(i > 1 && x->c[i-1]->n >= t ) {
for(j = y->n; j >= 1; j--)
y->key[j+1] = y->key[j];
y->key[1] = x->key[i-1];
y->n++;
x->key[i-1] = x->c[i-1]->key[x->c[i-1]->n];
if(!y->leaf) {
for(j = y->n; j >= 1; j--)
y->c[j+1] = y->c[j];
y->c[1] = x->c[i-1]->c[x->c[i-1]->n+1];
}
x->c[i-1]->n--;
} else {
if(i <= x->n) {
y->key[y->n+1] = x->key[i];
for(j = 1; j <= z->n; j++)
y->key[j+y->n+1] = z->key[j];
if(!y->leaf) {
for(j = 1; j <= z->n+1; j++)
y->c[j+y->n+1] = z->c[j];
}
y->n = y->n + 1 + z->n;
for(j = i; j < x->n; j++)
x->key[j] = x->key[j+1];
for(j = i+1; j <= x->n; j++)
x->c[j] = x->c[j+1];
x->n--;
if(x->n==0 && root == x)
root = y;
} else {
z = y;i--;
y = x->c[i];
y->key[y->n+1] = x->key[i];
for(j = 1; j <= z->n; j++)
y->key[j+y->n+1] = z->key[j];
if(y->leaf == false) {
for(j = 1; j <= z->n+1; j++)
y->c[j+y->n+1] = z->c[j];
}
y->n = y->n + 1 + z->n;
for(j = i; j < x->n; j++)
x->key[j] = x->key[j+1];
for(j = i+1; j <= x->n; j++)
x->c[j] = x->c[j+1];
x->n--;
if(x->n==0 && root == x)
root = y;
}
}
}
B_TREE_DELETE(y, k);
}
}
void B_TREE::B_TREE_PRINT(Tree_Node *x) {
for(int i = 1; i <= x->n; i++) {
if(!x->leaf)
B_TREE_PRINT(x->c[i]);
cout<<x->key[i]<<' ';
}
if(!x->leaf)
B_TREE_PRINT(x->c[x->n+1]);
}
int main() {
char c;
char ch[] = {'A','B','C','D'};
B_TREE *T = new B_TREE;
T->B_TREE_CREATE();
for(int i = 0; i < 4; i++) {
T->B_TREE_INSERT(ch[i]);
}
cout<<"这棵B树升序输出为: ";
T->B_TREE_PRINT(T->root);
cout<<endl;
cout<<"请输入你想要插入的字符(A~Z):";
cin>>c;
T->B_TREE_INSERT(c);
cout<<"插入后为:";
T->B_TREE_PRINT(T->root);
cout<<endl;
cout<<"请输入你想要删除的字符(A~Z):";
cin>>c;
T->B_TREE_DELETE(T->root,c);
cout<<"删除后为:";
T->B_TREE_PRINT(T->root);
cout<<endl;
return 0;
}
算法导论B树
最新推荐文章于 2022-03-06 21:41:17 发布