B樹 (插入操作)

2021-06-29 07:09:45 字數 2550 閱讀 4784

一顆m階的b樹滿足一下特性

(一)  樹中的每個結點至多有m顆子樹,至少有顆子樹。(除根結點和葉子結點外),其中表示m/2向上取整。()

(二)  樹中的每個結點至少有個關鍵字,至多m-1個關鍵字。

當結點的關鍵字個數滿時,那麼該結點就需要**,如何**?

假設*p結點已經有m-1個關鍵字,當再插入乙個關鍵字後,其關鍵字個數為m,超標了!**開始,將*p結點**成兩個結點,分別是*p,*。其中*p結點有個關鍵字,分別為,其中c表示孩子指標,k表示關鍵字,下表是個數。那麼*結點有個關鍵字,分別為。關鍵字和指標*一起插入到*p的雙親結點中,如下圖所示。

假設是4階b樹,*p結點已經有3個關鍵字,當再插入乙個關鍵字q時,*p結點關鍵字個數超標,需要**,**結果如下。

分析,因為是4階b樹,所以。

其中*p結點有=1個關鍵字,對應為結點h。

*結點有個關鍵字,對應n,q。

關鍵字和指標*一起插入到*p的雙親結點中。

再通俗點講就是,當在葉子結點插入乙個元素時,判斷葉子結點空間是否已滿?

1.       當葉子結點空間未滿時,只需要將葉子結點中關鍵字大於插入元素的位置都向後移動一位,留下的那個空位就放這個新插入的元素。

2.       當葉子結點空間已滿時,就需要**,將該葉子結點個元素**到其相鄰的右結點中,第個元素上跳到雙親結點中,並在適當的位置插入,當然,插入後雙親結點原先的元素及指標位置都要往後移動一位。(如果,此時雙親結點的空間也滿了,那麼也要做**操作)。

3.       如果是在根結點中插入元素,跟結點的空間滿了,那麼需要將第個元素上跳給新的根結點,這樣樹的高度就增加1。

/*-----code for fun---------------

-------created by dream_whui------

-------2015-3-22-------------------------*/

//b樹(插入及遍歷)

#include "stdafx.h"

#include typedef int keytype; //定義鍵值型別

#define order 4 //階數

#define btree_d 2 //[oredr/2]向上取整

typedef struct btnode

btnode, *btree;

void tree_split_child(btree &parent, int index, btree &node);

void btree_insert_nonfull(btree &node, keytype key)//在node中插入關鍵字key

node->key[i+1] = key;

node->keynum++;

} else //不是葉子結點,先找到插入的位置i

btree_insert_nonfull(node->child[i], key); }}

void tree_split_child(btree &parent, int index, btree &node)

if(!node->isleaf) //如果不是葉子結點,是內部結點 }

node->keynum = btree_d -1; //node關鍵字個數為btree_d -1

for (i = parent->keynum; i > index; --i) //因為不是在parent末尾插入關鍵字,因此從第i個孩子開始都網後移動乙個位置

parent->child[index+1] = newnode;//因為第index個孩子發生了**,因此第index+1個孩子指向新的結點

for (i = parent->keynum - 1; i >= index; --i) //同理,parent從第index個關鍵字也往後移動乙個位置

parent->key[index] = node->key[btree_d-1];//移動完後,第index個位置上的元素為node的第btree_d-1關鍵字

parent->keynum++;

node->key[btree_d-1] = 0;

}void btree_insert(btree &tree, keytype key)//在b樹中插入關鍵字key

if(root->keynum == (order-1)) //根結點的關鍵字個數已滿,即要**

else //根結點的關鍵字個數未滿

btree_insert_nonfull(root, key);

}void tree_print(btree tree, int layer=1)//b樹遍歷

printf("\n");

layer++;

for(i=0; i<=node->keynum; i++)

}else }

int _tmain(int argc, _tchar* argv)

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

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

B樹插入刪除操作

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

B 樹的插入 刪除操作

include include define maxm 10 b 樹最大階數 typedef int keytype keytype是關鍵字型別 typedef struct node btnode typedef struct b 樹的查詢結果型別 result int m m階b 樹作為全域性變...