Red-Black Trees


【二叉平衡搜索树】

红黑树的性质

(1) 每个节点都是红色或黑色的。
(2) 根是黑色的。
(3) 每片叶子(无)都是黑色的。限制出现相邻的红节点
(4) 如果一个节点是红色的,那么它的两个子节点都是黑色的。

(5) 对于每个节点,从节点到子代叶子的所有简单路径都包含相同数量的黑色节点。

红黑树的结构

空叶结点算作【外部节点】

Black-height

【一个红黑树的黑高最多是2ln(N+1)】

证明:

(1) 对任意节点x,sizeof(x) >= 2bh(x) – 1

如果h(x) = 0, x 为 null -> sizeof(x) >= 20 – 1 = 0

假设对所有h(x)<=k成立,对x且h(x)=k+1:

bh(child) = bh(x) 或 bh(x) – 1

由于 h(child) <= k,sizeof(child) >= 2bh(child) – 1 >= 2bh(x) – 1

因此 sizeof(x) = 1 + 2sizeof(child) >= 2bh(x) – 1

(2) bh(Tree) >= h(Tree)/2

Insert 插入

(1) 基础插入操作,同二叉搜索树

(2) 染色操作。如果染成黑色,会影响整个树的黑高;如果染成红色,会存在相邻红节点,或插入为根,破坏了根节点为黑的性质。

->插入思想:按照二叉树插入并染成红色。

*如果能够局部调整,就使用局部调整解决。如果局部调整解决不了,就将问题转移到根节点,通过根节点换色解决。

Delete 删除

(1) 查找树的删除

删除叶结点:把父节点的指针置为NULL

删除单孩节点:把父节点的指针指向单孩节点

删除满节点:找出替换当前位置节点的新节点(左子树最大or右子树最小)把替换节点保持住被删除节点的颜色。

(2) 删除黑节点的情况需要调整。

用例:

①兄弟红易兄弟黑,换色斜旋接着推;
②侄黑父红换兄色,父侄全黑兄染红,上推;
③近侄红来远侄黑,换色斜旋模样改;
④远侄红来令其黑,父兄换色斜旋坠。


B+ Trees


【用于二级存储】

*I/O访问与内存访问相比速度差万倍单位。

B+树的性质

M阶B+树是具有以下结构属性的树:

(1) 根要么是一片叶子,要么有2到M个孩子

(2) 所有非叶节点(根除外)都有⌈M/2⌉到M个子节点

(3) 所有的叶子都在同一深度

假设每个非根叶也有⌈M/2⌉到M个子叶

叶结点放数据,非叶结点放索引。

4阶B+树(2-3-4树)

B+树的插入

Btree  Insert ( ElementType X,  Btree T ) 
{ 
  Search from root to leaf for X and find the proper leaf node;
  Insert X;
  while ( this node has M+1 keys ) {
    		split it into 2 nodes with (M+1)/2 and (M+1)/2  keys, respectively;
    		if (this node is the root)
        		create a new root with two children;
    		check its parent;
  }
} 

*The best choice of M is 3 or 4.


0 条评论

发表评论

Avatar placeholder