红黑树
1. 定义
R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。
1.节点是红色或黑色。
2.根节点是黑色。
3.每个叶子节点都是黑色的空节点(NIL节点)。
4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
5.从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
1.1 树
树(Tree)是由多个节点(Node)的集合组成,每个节点又有多个与其关联的子节点(Child Node)。子节点就是直接处于节点之下的节点,而父节点(Parent Node)则位于节点直接关联的上方。树的根(Root)指的是一个没有父节点的单独的节点。
所有的树都呈现了一些共有的性质:
- 只有一个根节点;
- 除了根节点,所有节点都有且只有一个父节点;
- 无环。将任意一个节点作为起始节点,都不存在任何回到该起始节点的路径。(正是前两个性质保证了无环的成立。)
1.2 完全二叉树和满二叉树
-
完全二叉树(Complete Binary Tree):
- 深度为 h,有 n 个节点的二叉树,当且仅当其每一个节点都与深度为 h 的满二叉树中,序号为 1 至 n 的节点对应时,称之为完全二叉树
- 最后一层叶子节点不满
-
满二叉树(Full Binary Tree):
- 一棵深度为 h,且有 2h - 1 个节点称之为满二叉树
- 最后一层全部都是叶子节点
1.3 二叉查找树
二叉查找树(BST:Binary Search Tree)是一种特殊的二叉树,它改善了二叉树节点查找的效率。二叉查找树有以下性质:
对于任意一个节点 n,
- 其左子树(left subtree)下的每个后代节点(descendant node)的值都小于节点 n 的值;
- 其右子树(right subtree)下的每个后代节点的值都大于节点 n 的值。
所谓节点 n 的子树,可以将其看作是以节点 n 为根节点的树。子树的所有节点都是节点 n 的后代,而子树的根则是节点 n 本身
查找算法过程如下:
假设我们要查找节点 n,从 BST 的根节点开始。算法不断地比较节点值的大小直到找到该节点,或者判定不存在。每一步我们都要处理两个节点:树中的一个节点,称为节点 c,和要查找的节点 n,然后并比较 c 和 n 的值。开始时,节点 c 为 BST 的根节点。然后执行以下步骤:
- 如果 c 值为空,则 n 不在 BST 中;
- 比较 c 和 n 的值;
- 如果值相同,则找到了指定节点 n;
- 如果 n 的值小于 c,那么如果 n 存在,必然在 c 的左子树中。回到第 1 步,将 c 的左孩子作为 c;
- 如果 n 的值大于 c,那么如果 n 存在,必然在 c 的右子树中。回到第 1 步,将 c 的右孩子作为 c;
BST 算法查找时间依赖于树的拓扑结构。最佳情况是 O(log2n),而最坏情况是 O(n)
2. 演变
2.1 2-3树
一颗2-3树或为一颗空树,或有以下节点组成:
-
2-节点,含有一个元素和两个子树(左右子树),左子树所有元素的值均小于它父节点,右子树所有元素的值均大于它父节点;
-
3-节点,含有两个元素和三个子树(左中右子树),左子树所有元素的值均小于它父节点,中子树所有元素的值都位于父节点两个元素之间,右子树所有元素的值均大于它父节点;
-
子树也是空树、2-节点或者3-节点;
-
没有元素相等的节点。
2.2 2-3-4树
2-3-4树的名字是根据子节点数来确定的。
我们看2-3-4树的key的种类
- 2-node: one key, two children.一个key值,两个儿子节点
- 3-node: two keys, three childre.两个key值,三个儿子节点
- 4-node: three keys, four children.三个key值,四个儿子节点
特性
- 2-node
- 2-node的左孩子就代表比key小
- 右孩子就代表比key大
- 3-node
- 3-node的左孩子代表比第一个key小
- 中间的孩子代表值位于第一个key和第二个key之间
- 右孩子代表值大于第二个key
- 4-node
- 4-node的左孩子代表比第一个key小
- 中间的第一个孩子代表值位于第一个key和第二个key之间
- 中间的第二个孩子代表值位于第二个key和第三个key之间
- 右孩子代表值大于第三个key