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

2021-08-14 04:06:29 字數 2164 閱讀 9085

b樹是一種平衡的多分樹,通常我們說m階的b樹,它必須滿足如下條件:

(1)每個結點至多有m個子結點;

(2)除根結點和葉結點外,其它每個結點至少有ceil(m/2)個子結點;

(3)根結點至少有兩個子結點;(唯一例外的是根結點就是葉子結點)

(4)所有的葉結點在同一層;

(5)有k個子結點的非根結點恰好包含k-1個關鍵碼,關鍵碼按照遞增次序進行排列。

ceil代表向上取整

b-樹的查詢很簡單,是二叉排序樹的擴充套件,二叉排序樹是二路查詢,b-樹是多路查詢,因為b-樹結點內的關鍵字是有序的,在結點內進行查詢時除了順序查詢外,還可以用折半查詢來提公升效率。b-樹的具體查詢步驟如下(假設查詢的關鍵字為key):

(1)先讓key與根結點中的關鍵字比較,如果key等於k[i](k為結點內的關鍵字陣列),則查詢成功;

(2)若key小於k[1],則到p[0]所指示的子樹中進行繼續查詢(p為結點內的指標陣列),這裡要注意b樹中每個結點的內部結構;

(3)若key大於k[n],則道p[n]所指示的子樹中繼續查詢;

(4)若k[i]大於key小於k[i+1],則沿著指標p[i]所指示的子樹繼續查詢;

(5)如果最後遇到空指標,則證明查詢不成功。

以乙個3階的b樹為例:

(1)如果該結點的關鍵字個數沒有到達2個,那麼直接插入即可;

(2)如果該結點的關鍵字個數已經到達了2個,那麼根據b樹的性質顯然無法滿足,需要將其進行**

**的規則是該結點分成兩半,將中間的關鍵字進行提公升,加入到父親結點中,但是這又可能存在父親結點也滿員的情況,則不得不向上進行回溯,甚至是要對根結點進行**,那麼整棵樹都加了一層。

例1——————————————

例2——————————————-

首先需要明確一點:刪除非葉子結點必然會導致不滿足b樹性質

那麼可以這樣處理:被刪關鍵字為該結點中第i個關鍵字key[i],則可從指標son[i]所指的子樹中找出最小關鍵字y,代替key[i]的位置,然後在葉結點中刪去y。 因此,把在非葉結點刪除關鍵字k的問題就變成了刪除葉子結點中的關鍵字的問題了,

那麼b樹的刪除操作就變成了刪除葉子結點中的關鍵字問題了。

(1)被刪關鍵字ki所在結點的關鍵字數目不小於ceil(m/2),則只需從結點中刪除ki和相應指標ai,樹的其它部分不變

(2)被刪關鍵字ki所在結點的關鍵字數目等於ceil(m/2)-1,則需調整。

(3)被刪關鍵字ki所在結點和其相鄰兄弟結點中的的關鍵字數目均等於ceil(m/2)-1,假設該結點有右兄弟,且其右兄弟結點位址由其雙親結點指標ai所指。則在刪除關鍵字之後,它所在結點的剩餘關鍵字和指標,加上雙親結點中的關鍵字ki一起,合併到ai所指兄弟結點中(若無右兄弟,則合併到左兄弟結點中)。如果因此使雙親結點中的關鍵字數目少於ceil(m/2)-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 樹作為全域性變...

B樹 (插入操作)

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