B树代码实现
阶数 :3; 输入:1 2 3 4 5;
代码只验证过10以下数据。有兴趣,最好跟着下面流程看
#include<stdio.h>
#include<stdlib.h>
typedef struct Value{ //相当于树节点数组下的一个值
int data;
struct Node *lchild,*rchild;
struct Node *parent;
}Value;
typedef struct Node{ //这个相当于树节点,将树节点设置为数组
int size;
struct Value *value;
struct Value *parent;
}Node;
Value *MallocValue(Value *p){
p=(Value *)malloc(sizeof(Value));
p->lchild=NULL;
p->rchild=NULL;
p->parent=NULL;
return p;
}
Node *Malloc(Node *p,int n){
p=(Node *)malloc(sizeof(Node));
p->value=(Value *)malloc(sizeof(Value)*n);
p->size=0;
p->parent=NULL;
return p;
}
void ComParent(Node *p,Value *e,int n){
int flag=0;
if(p->size>=n-1){
for(int i=0;i<p->size;i++){
if(e->data<p->value[i].data){
flag=1;
Node *s;
Value *v;
v=MallocValue(v);
s=Malloc(s,n);
for(int j=n-2;j>=i;j--){ //先将值插入
p->value[j+1]=p->value[j];
}
e->parent=p;
p->value[i]=*e;
p->size++;
*v=p->value[(n-1)/2];
p->size--;
for(int j=0;j<(n-1)/2;j++){
s->value[j]=p->value[j];
s->value[j].parent=s;
s->size++;
p->size--;
}
s->parent=v;
v->lchild=s;
v->rchild=NULL;
for(int j=(n-1)/2+1;j<=n-1;j++){
p->value[j-(n-1)/2-1]=p->value[j];
}
if(p->parent!=NULL){
ComParent(p->parent->parent,v,n);
}else{
Node *pa;
pa=Malloc(pa,n);
p->parent=v;
v->rchild=p;
v->parent=pa;
pa->value[0]=*v;
pa->size++;
}
break;
}
}
if(flag==0){
Node *s;
Value *v;
v=MallocValue(v);
s=Malloc(s,n);
e->parent=p;
p->value[n-1]=*e;
p->size++;
*v=p->value[(n-1)/2];
p->size--;
for(int j=0;j<(n-1)/2;j++){
s->value[j]=p->value[j];
s->value[j].parent=s;
s->size++;
p->size--;
}
s->parent=v;
v->lchild=s;
v->rchild=NULL;
for(int j=(n-1)/2+1;j<=n-1;j++){
p->value[j-(n-1)/2-1]=p->value[j];
}
if(p->parent!=NULL){
ComParent(p->parent->parent,v,n);
}else{
Node *pa;
pa=Malloc(pa,n);
p->parent=v;
v->rchild=p;
v->parent=pa;
pa->value[0]=*v;
pa->size++;
}
}
}else{
for(int i=0;i<p->size;i++){
if(e->data<p->value[i].data){
flag=1;
for(int j=p->size-1;j>=i;j--){
p->value[j+1]=p->value[j];
}
e->parent=p;
p->value[i]=*e;
p->size++;
break;
}
}
if(flag==0){
e->parent=p;
p->value[p->size]=*e;
p->size++;
}
}
}
void RChildCope(Node *p,Value *e,int n){ //对于右孩子需要分离右边数据
if(e->data>=p->value[p->size-1].data){ //插入值大于最大一个
if(p->size>=n-1){
if(p->value[p->size-1].rchild!=NULL){
RChildCope(p->value[p->size-1].rchild,e,n);
}else{
//首先将中间值向父节点传,并将小于中间值的独立成一个子节点,成为中间值的左孩子
//大于中间值的向左移动,再将值插入
//中间传入父节点后再进行类似比较
Node *s;
Value *v;
v=MallocValue(v);
s=Malloc(s,n);
e->parent=p;
p->value[n-1]=*e;
p->size++;
*v=p->value[(n-1)/2];
p->size--;
for(int j=(n-1)/2+1;j<n;j++){
s->value[j-(n-1)/2-1]=p->value[j];
s->value[j].parent=s;
s->size++;
p->size--;
}
s->parent=v;
v->rchild=s;
v->lchild=p;
if(p->parent!=NULL){
ComParent(p->parent->parent,v,n);
}else{
Node *pa;
pa=Malloc(pa,n);
p->parent=v;
v->parent=pa;
pa->value[0]=*v;
pa->size++;
}
}
}else{
if(p->value[p->size-1].rchild!=NULL){
RChildCope(p->value[p->size-1].rchild,e,n);
}else{
e->parent=p;
p->value[p->size]=*e;
p->size++;
}
}
}else{
for(int i=0;i<=p->size-1;i++){
if(e->data<p->value[i].data){
if(p->size>=n-1){
if(p->value[p->size-1].lchild!=NULL){
Compare(p->value[p->size-1].lchild,e,n);
break;
}else{
Node *s;
Value *v;
v=MallocValue(v);
s=Malloc(s,n);
for(int j=n-2;j>=i;j--){ //先将值插入
p->value[j+1]=p->value[j];
}
e->parent=p;
p->value[i]=*e;
p->size++;
*v=p->value[(n-1)/2];
p->size--;
for(int j=(n-1)/2+1;j<p->size;j++){
s->value[j-(n-1)/2-1]=p->value[j];
s->value[j-(n-1)/2-1].parent=s;
s->size++;
p->size--;
}
s->parent=v;
v->rchild=s;
v->lchild=p;
if(p->parent!=NULL){
ComParent(p->parent->parent,v,n);
break;
}else{
Node *pa;
pa=Malloc(pa,n);
p->parent=v;
v->parent=pa;
pa->value[0]=*v;
pa->size++;
break;
}
}
}else{
if(p->value[i].lchild!=NULL){
Compare(p->value[i].lchild,e,n);
break;
}else{
for(int j=p->size-1;j>=i;j--){
p->value[j+1]=p->value[j];
}
e->parent=p;
p->value[i]=*e;
p->size++;
break;
}
}
}
}
}
}
void Compare(Node *p,Value *e,int n){
if(e->data>=p->value[p->size-1].data){ //插入值大于最大一个,最大右子树需要分离右边
if(p->size>=n-1){
if(p->value[p->size-1].rchild!=NULL){
RChildCope(p->value[p->size-1].rchild,e,n);
}else{
//首先将中间值向父节点传,并将小于中间值的独立成一个子节点,成为中间值的左孩子
//大于中间值的向左移动,再将值插入
//中间传入父节点后再进行类似比较
Node *s;
Value *v;
v=MallocValue(v);
s=Malloc(s,n);
e->parent=p;
p->value[n-1]=*e;
p->size++;
*v=p->value[(n-1)/2];
p->size--;
for(int j=0;j<(n-1)/2;j++){
s->value[j]=p->value[j];
s->value[j].parent=s;
s->size++;
p->size--;
}
s->parent=v;
v->lchild=s;
v->rchild=p;
for(int j=(n-1)/2+1;j<=n-1;j++){
p->value[j-(n-1)/2-1]=p->value[j];
}
if(p->parent!=NULL){
ComParent(p->parent->parent,v,n);
}else{
Node *pa;
pa=Malloc(pa,n);
p->parent=v;
v->parent=pa;
pa->value[0]=*v;
pa->size++;
}
}
}else{
if(p->value[p->size-1].rchild!=NULL){
RChildCope(p->value[p->size-1].rchild,e,n);
}else{
e->parent=p;
p->value[p->size]=*e;
p->size++;
}
}
}else{
for(int i=0;i<=p->size-1;i++){
if(e->data<p->value[i].data){
if(p->size>=n-1){
if(p->value[p->size-1].lchild!=NULL){
Compare(p->value[p->size-1].lchild,e,n);
break;
}else{
Node *s;
Value *v;
v=MallocValue(v);
s=Malloc(s,n);
for(int j=n-2;j>=i;j--){ //先将值插入
p->value[j+1]=p->value[j];
}
e->parent=p;
p->value[i]=*e;
p->size++;
*v=p->value[(n-1)/2];
p->size--;
for(int j=0;j<(n-1)/2;j++){
s->value[j]=p->value[j];
s->value[j].parent=s;
s->size++;
p->size--;
}
s->parent=v;
v->lchild=s;
v->rchild=p;
for(int j=(n-1)/2+1;j<=n-1;j++){
p->value[j-(n-1)/2-1]=p->value[j];
}
if(p->parent!=NULL){
ComParent(p->parent->parent,v,n);
break;
}else{
Node *pa;
pa=Malloc(pa,n);
p->parent=v;
v->parent=pa;
pa->value[0]=*v;
pa->size++;
break;
}
}
}else{
if(p->value[i].lchild!=NULL){
Compare(p->value[i].lchild,e,n);
break;
}else{
for(int j=p->size-1;j>=i;j--){
p->value[j+1]=p->value[j];
}
e->parent=p;
p->value[i]=*e;
p->size++;
break;
}
}
}
}
}
}
Node *insert(Node *tree,int e,int n){
Value *v;
if(tree==NULL){
tree=Malloc(tree,n);
tree->size++;
tree->value[0].data=e;
tree->value[0].lchild=NULL;
tree->value[0].rchild=NULL;
tree->value[0].parent=tree;
return tree;
}
v=MallocValue(v);
v->data=e;
Compare(tree,v,n);
while(tree->parent!=NULL){
tree=tree->parent->parent;
}
return tree;
}
void main(){
int n,e;
Node *tree=NULL;
printf("请输入创建B树的阶数!!");
scanf("%d",&n);
printf("请输入数值!!");
scanf("%d",&e);
while(e!=999){
tree=insert(tree,e,n);
printf("请输入数值!!");
scanf("%d",&e);
}
printf(" %d ",tree->value[0].data);
printf("%d\n",tree->value[1].data);
// printf("%d-->%d-->\n",tree->value[0].rchild->value[0].data);
printf("%d ",tree->value[0].lchild->value[0].data);
printf("%d ",tree->value[0].rchild->value[0].data);
// printf("%d ",tree->value[0].rchild->value[1].data);
// printf("%d ",tree->value[1].lchild->value[0].data);
// printf("%d-->%d\n",tree->value[0].lchild->value[0].data,tree->value[0].lchild->size);
// printf("%d-->\n",tree->value[0].lchild->value[1].data);
// printf("%d-->\n",tree->value[1].lchild->value[0].lchild->value[0].data);
printf("%d ",tree->value[1].rchild->value[0].data);
printf("%d ",tree->value[1].rchild->value[1].data);
printf("%d ",tree->value[1].rchild->value[2].data);
}