算法导论B树

#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;
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值