B 樹的基本操作

2021-07-08 19:05:33 字數 3456 閱讀 8770

#include #include #define maxm 10                     //定義b-樹的最大的階數

typedef int keytype; //keytype為關鍵字型別

typedef struct node //b-樹結點型別定義

btnode;

typedef struct //b-樹的查詢結果型別

result;

int m; //m階b-樹,為全域性變數

int max; //m階b-樹中每個結點的至多關鍵字個數,max=m-1

int min; //m階b-樹中非葉子結點的至少關鍵字個數,min=(m-1)/2

int search(btnode *p,keytype k)

result searchbtree(btnode *t,keytype k)

}r.i=i;

if (found==1) //查詢成功

else //查詢不成功,返回k的插入位置資訊

return r; //返回k的位置(或插入位置)

}void insert(btnode *&q,int i,keytype x,btnode *ap)

q->key[i+1]=x;

q->ptr[i+1]=ap;

if (ap!=null) ap->parent=q;

q->keynum++;

}void split(btnode *&q,btnode *&ap)

ap->keynum=q->keynum-s;

ap->parent=q->parent;

for (i=0; i<=q->keynum-s; i++) //修改指向雙親結點的指標

if (ap->ptr[i]!=null) ap->ptr[i]->parent = ap;

q->keynum=s-1; //q的前一半保留,修改keynum

}void newroot(btnode *&t,btnode *p,keytype x,btnode *ap)

void insertbtree(btnode *&t, keytype k, btnode *q, int i)

else neednewroot=1;}}

if (neednewroot==1) //根結點已**為結點*q和*ap

newroot(t,q,x,ap); //生成新根結點*t,q和ap為子樹指標

}}void dispbtree(btnode *t) //以括號表示法輸出b-樹

dispbtree(t->ptr[t->keynum]);

if (t->ptr[0]!=0) printf(")"); //至少有乙個子樹時輸出")"號}}

}void remove(btnode *p,int i)

//從*p結點刪除key[i]和它的孩子指標ptr[i]

p->keynum--;

}void successor(btnode *p,int i)

//查詢被刪關鍵字p->key[i](在非葉子結點中)的替代葉子結點

void moveright(btnode *p,int i)

//把乙個關鍵字移動到右兄弟中

t->ptr[1]=t->ptr[0]; //從雙親結點移動關鍵字到右兄弟中

t->keynum++;

t->key[1]=p->key[i];

t=p->ptr[i-1]; //將左兄弟中最後乙個關鍵字移動到雙親結點中

p->key[i]=t->key[t->keynum];

p->ptr[i]->ptr[0]=t->ptr[t->keynum];

t->keynum--;

}void moveleft(btnode *p,int i)

//把乙個關鍵字移動到左兄弟中

}void combine(btnode *p,int i)

//將三個結點合併到乙個結點中

for (c=i; ckeynum; c++) //刪除父結點所有的關鍵字

p->keynum--;

free(q); //釋放空右結點的空間

}void restore(btnode *p,int i)

//關鍵字刪除後,調整b-樹,找到乙個關鍵字將其插入到p->ptr[i]中

int searchnode(keytype k,btnode *p,int &i)

//在結點p中找關鍵字為k的位置i,成功時返回1,否則返回0

else //在*p結點中查詢

}int recdelete(keytype k,btnode *p)

//查詢並刪除關鍵字k

else

remove(p,i); //從*p結點中位置i處刪除關鍵字

}else

found=recdelete(k,p->ptr[i]); //沿孩子結點遞迴查詢並刪除關鍵字k

if (p->ptr[i]!=null)

if (p->ptr[i]->keynumkeynum==0)

}int main()

,k; m=3; //3階b-樹

max=m-1;

min=(m-1)/2;

printf("建立一棵%d階b-樹:\n",m);

for (j=0; j

printf(" 結果b-樹: ");

dispbtree(t);

printf("\n");

printf("刪除操作:\n");

k=8;

deletebtree(k,t);

printf(" 刪除%d: ",k);

printf("b-樹: ");

dispbtree(t);

printf("\n");

k=1;

deletebtree(k,t);

printf(" 刪除%d: ",k);

printf("b-樹: ");

B 樹的基本操作

include include define maxm 10 定義b 樹的最大的階數 typedef int keytype keytype為關鍵字型別 typedef struct node b 樹結點型別定義 btnode typedef struct b 樹的查詢結果型別 result int...

專案 3 B 樹的基本操作

all right reserved.檔名稱 test.cpp 完成日期 2016年12月16日 版本號 v1.7.7 問題描述 實現b 樹的基本操作。基於序列完成 測試。1 建立對應的3階b 樹b,用括號法輸出b樹。2 從b中分別刪除關鍵字為8和1的節點,用括號法輸出刪除節點後的b樹。程式輸入 無...

B樹 B 樹 B 樹 B 樹相關定義及操作

b 樹即二叉搜尋樹 1.所有非葉子結點至多擁有兩個兒子 left 和right 2.所有結點儲存乙個關鍵字 3.非葉子結點的左指標指向小於其關鍵字的子樹,右指標指向大於其關鍵字的子樹 如 b樹的搜尋,從根結點開始,如果查詢的關鍵字與結點的關鍵字相等,那麼就命中 否則,如果查詢關鍵字比結點關鍵字小,就...