B 樹的插入 刪除操作

2021-06-08 18:27:32 字數 3074 閱讀 3648

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

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

typedef struct node

btnode;

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

result;

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

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

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

/*1.在p->key[1...keynum]中查詢i,使得p->key[i]<=kkey[i+1]*/

int search(btnode *p,keytype k)

/*2.在m階t樹t上查詢關鍵字k,返回結果(pt,i,tag)。

若查詢成功,則特徵值tag=1,指標pt所指節點中第i個關鍵字=k;

否則特徵值tag=0,等於k的光劍子應該插入在指標pt所指節點中第i和第i+1個關鍵字之間

*/result searchbtree(btnode *t,keytype k)

} r.i=i;

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

else //查詢失敗,返回k的插入位置資訊

return r; //返回k的位置,或者插入的位置

}/*3.將x和ap分別插入到q->key[i+1]和q->ptr[i+1]中*/

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++;

}/*4.將節點q**成兩個節點,前一半保留,後一半移入新生節點ap*/

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

}/*5.生成含資訊(t,x,ap)的新的根結點*t,原t和ap為子樹指標*/

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

/*6.在m階t樹t上結點*q的key[i]與key[i+1]之間插入關鍵字k。

若引起結點過大,則沿雙親鏈進行必要的節點**調整,使得t荏苒是m階t樹

*/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為子樹指標 }}

/*7以括號表示法輸出b-樹*/

void dispbtree(btnode *t)

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

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

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

void remove(btnode *p,int i)

p->keynum--;

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

void successor(btnode *p,int i)

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

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

}/*11.把乙個關鍵字移動的左兄弟中*/

void moveleft(btnode *p,int i)

}/*12.將3個結點合併到乙個節點中*/

void combine(btnode *p,int i)

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

p->keynum--;

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

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

void restore(btnode *p,int i)

/*14.在結點p中找關鍵字為k的位置i,成功時返回1,失敗返回0*/

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

else //在*p結點中查詢 }

/*15.查詢並刪除關鍵字k*/

int recdelete(keytype k,btnode *p)

else

remove(p,i);

} else

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

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

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

void main()

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

max=m-1;

min=(m-1)/2;

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

for(j=0; j

B樹插入刪除操作

b 樹定義 一種平衡的多路查詢樹。用於 索引組織檔案,減少訪問外存次數,節約搜尋時間。一棵m階b 樹或為空樹,或滿足下列特性 為盡量簡單,把考試不考的內容全部略去 1 樹中每個結點至多有m個分支,最少有 m 2 分支,取上整,除根結點外 2.關鍵字數大於等於m 2 1,小於等於m 1,2取上整 3 ...

B樹(又稱B 樹)插入 刪除操作

b樹是一種平衡的多分樹,通常我們說m階的b樹,它必須滿足如下條件 1 每個結點至多有m個子結點 2 除根結點和葉結點外,其它每個結點至少有ceil m 2 個子結點 3 根結點至少有兩個子結點 唯一例外的是根結點就是葉子結點 4 所有的葉結點在同一層 5 有k個子結點的非根結點恰好包含k 1個關鍵碼...

B樹 (插入操作)

一顆m階的b樹滿足一下特性 一 樹中的每個結點至多有m顆子樹,至少有顆子樹。除根結點和葉子結點外 其中表示m 2向上取整。二 樹中的每個結點至少有個關鍵字,至多m 1個關鍵字。當結點的關鍵字個數滿時,那麼該結點就需要 如何 假設 p結點已經有m 1個關鍵字,當再插入乙個關鍵字後,其關鍵字個數為m,超...