B樹 是一種自平衡的多路搜尋樹,廣泛應用於資料庫索引與檔案系統。本文提供一個完整、可編譯執行的 C++ B樹實作 (階數 M=2,即 2-3-4 樹),涵蓋插入、刪除、節點分裂/合併、前驅/後繼查找、鍵值交換等核心操作,並附帶層序遍歷輸出驗證。
class BTree {
static const int M = 2; // 階數,每個節點最多 2*M-1=3 個鍵,2*M=4 個孩子
struct BTNode {
int keyNum; // 當前鍵數量
int key[2 * M - 1]; // 鍵陣列
BTNode* child[2 * M]; // 孩子指標陣列
bool isLeaf; // 是否葉子節點
};
BTNode* root;
// 私有輔助方法...
public:
BTree(); ~BTree();
void insert(int key);
void remove(int key);
BTNode* search(int key, int& index);
void PrintRow(); // 層序列印
};
SplitChild 預先分裂)。當節點擁有 2*M-1 個鍵時分裂:
ExchangeLeft/RightNode) 或與兄弟合併 (merge)。| 方法 | 功能 |
|---|---|
predecessor | 尋找前驅:沿最右孩子下降至葉子,取最大鍵 |
successor | 尋找後繼:沿最左孩子下降至葉子,取最小鍵 |
ExchangeLeftNode | 從左兄弟借鍵:父節點鍵下移,左兄弟最大鍵上移 |
ExchangeRightNode | 從右兄弟借鍵:父節點鍵下移,右兄弟最小鍵上移 |
merge | 合併兩鄰居節點:父節點鍵下移,兩節點鍵與孩子合併 |
int main() {
BTree tree;
// 插入 20 個字元鍵值
string keys = "cngah ekqmwflt zydprxys";
for (char c : keys) if (c != ' ') tree.insert(c);
tree.remove('n');
tree.remove('b'); // 不存在
tree.PrintRow(); // 層序列印樹結構
return 0;
}
程式碼包含以下核心部分 (完整可編譯版本請參考原始輸入):
Search:標準 B樹搜尋,回傳節點與鍵索引。InsertNonFull / SplitChild:插入核心遞迴邏輯。RemoveNonLess / merge / ExchangeLeft/RightNode:刪除核心邏輯。PrintRow:使用佇列實現層序遍歷,每行輸出一個節點的所有鍵。M (最小度數) 如何決定節點容量與分裂/合併閾值。