1. 程式人生 > >Programming is an art form.

Programming is an art form.

一、定義

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[]為結點內的關鍵字陣列),則查詢成功;

三、插入

以一個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,則依次類推。

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述