#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,超...