b+樹c語言實現
結點插入
什麼是b樹
為什麼要用b樹
b樹的性質
我們按照如下性質,來定義一棵非空的m階b樹(m>2,2階b樹相當於二叉平衡查詢樹):
每個非葉子節點中存放若干關鍵字資料,並且有若干指向兒子節點的指標。指標數目=關鍵字數目+1
根節點有最少1個,最多m-1個關鍵字,最少2個,最多m個子節點。
非根節點最少有[m/2](向上取整),最多m-1個關鍵字
每個節點中的關鍵字從左到右以非降序排列
每個關鍵字均不小於其左子節點的關鍵字,不大於其右子節點的所有關鍵字
每個葉子節點都具有相同的深度
b+樹與b樹的區別
在b+樹中,具有n個關鍵字的結點只含有n棵子樹,即每個關鍵字對應一棵子樹;而在b樹中,具有n個關鍵字的結點含有(n+1)棵子樹。
在b+樹中,每個結點(非根結點)關鍵字個數n的範圍是[m/2向上取整,m](根結點:1<=n<=m),在b樹中,每個結點(非根結點)關鍵字個數n的範圍是[m/2向上取整-1,m-1](根結點:1<=n<=m-1)。
在b+樹中,葉結點包含資訊,所有非葉結點僅起到索引作用,非葉結點中的每個索引項只含有對應子樹的最大關鍵字和指向該子樹的指標,不含有該關鍵字對應記錄的儲存位址。
在b+樹中,葉結點包含了全部關鍵字,即在非葉結點**現的關鍵字也會出現在葉結點中;而在b樹中,葉結點包含的關鍵字和其他結點包含的關鍵字是不重複的。
b+樹的特點
通常在b+樹中有兩個頭指標:乙個指向根結點,另乙個指向關鍵字最小的葉結點。因此,可以對b+樹進行兩種查詢運算:一種是從最小關鍵字開始的順序查詢,另一種是從根結點開始,進行多路查詢。
資料結構定義
#define order 3
//b樹的階數
typedef
int keytype;
//關鍵字資料型別
typedef
struct btnode //b樹結點
btnode;
typedef btnode* btree;
///定義btree
建立b樹
初始化乙個空結點
btree btree_init()
根據給定的資料集合進行建樹void
btree_create
(btree *tree,
const keytype *data,
int length)
}
結點插入
判斷節點是否是滿節點
int
isfull
(btnode *node)
else
}
進行遞迴插入void
btree_insert
(btree *tree,keytype key)
//是葉子節點且不滿,直接插入
if(bnp-
>isleaf &&
!isfull
(bnp)
)else
break;}
}}return;}
//不是葉子節點,查詢對應的子樹,遞迴插入if(
!bnp-
>isleaf)
}btree_insert(&
((*tree)
->child[bnp-
>keynum]
),key);}
}
子樹的**void
split_tree
(btree *tree)
else
//新關鍵字插到中間
if(bp-
>key[i]
>bnp1-
>key[split])}
}}bnp1-
>keynum = split;
bnp2-
>keynum = num - split -1;
for(
int i =
0, j = split+
1;j) bnp2-
>child[bnp2-
>keynum]
= null;
bnp2-
>isleaf = bnp1-
>isleaf;
bnp2-
>parent = bp;
bnp1-
>parent = bp;
(*tree)
= bp;
}
資料結構 四 B樹 B 樹 B 樹 B 樹
b樹 即二叉搜尋樹 1.所有非葉子結點至多擁有兩個兒子 left和right 2.所有結點儲存乙個關鍵字 3.非葉子結點的左指標指向小於其關鍵字的子樹,右指標指向大於其關鍵字的子樹 如 b樹的搜尋,從根結點開始,如果查詢的關鍵字與結點的關鍵字相等,那麼就命中 否則,如果查詢關鍵字比結點關鍵字小,就進...
資料結構之B樹 B 樹 B 樹 B 樹
b 樹b 樹 b b b 樹是為了磁碟或其它儲存裝置而設計的一種平衡多路查詢樹 相對於二叉,b樹每個內節點有多個分支 與紅黑樹相比,在相同的的節點的情況下,一顆b樹的高度遠遠小於紅黑樹的高度.b樹上操作的時間通常由訪問磁碟的時間和cpu計算時間這兩部分構成,而cpu的速度非常快,所以b樹的操作效率取...
資料結構 B樹 B 樹 B 樹 B 概念
b樹 即二叉搜尋樹 1.所有非葉子結點至多擁有兩個兒子 left和right 2.所有結點儲存乙個關鍵字 3.非葉子結點的左指標指向小於其關鍵字的子樹,右指標指向大於其關鍵字的子樹 如 b樹的搜尋,從根結點開始,如果查詢的關鍵字與結點的關鍵字相等,那麼就命中 否則,如果查詢關鍵字比結點關鍵字小,就進...