week5: Balanced Search Trees
2-3树
定义
2-3树是一种搜索树,其节点有三种可能:
- 空节点:null
- 2-节点:有一个键值和两个指针,左指针指向键值较小的子2-3树,右指针指向键值较大的子2-3树。(同BST的内部节点)
- 3-节点:有两个键值和三个指针,左指针指向键值较小的子2-3树,中间指针指向键值在当前节点两键值之间的子2-3树,右指针指向键值较大的子2-3树。
(放个2-节点和3-节点的图)
搜索
由上图可知,搜索过程与BST类似,只是遇到3-节点时需要多些条件判断,在此不再赘述。
插入
在搜索失败时,我们需要插入一个新节点。与BST不同,2-3树不会直接在null的位置加入一个新节点,而是尝试融入进搜索过程最后的叶子节点。根据叶子节点键值的个数,我们有两种情况:
- 叶子节点是2-节点。那么我们只需将新节点的值加入进去,变为3-节点即可。
- 叶子节点是3-节点。同上,我们先暂时将该节点变为4-节点。由于其不符合规则,我们再将其分裂为三个2-节点——以中值为键的节点作为父节点,较小值的为左子树,较大值的为右子树。注意:若该节点的父节点已经是3-节点,那么提出来的父节点会再融入进去,重复这一过程,以此类推。
(放出三个情况的图)
特性
- 树是保持平衡且有序的
- 根节点到任一空节点的链接(links)数相同
红黑树
由于需要在一个节点内维护可变个数的键值,以及分裂节点的可能情况较多,我们并不直接实现2-3树。1979年Guibas和Sedgewick(Algorithms的作者)提出了左倾红黑树(left-leaning red-black tree),将2-3树表示为BST,较易实现。
红与黑
为了将2-3树映射为BST,红黑树的链接(links)用红与黑两种颜色表示不同的情况。红链接连接的节点融合起来就是2-3树的3-节点,黑链接是2-3树的普通链接。
(给出映射图)
红黑树简化了树的结构,当然会有一定的约束:
- 不能存在节点有两个红链接。因为在这种时候,对应到2-3树就是一个4-节点,不符合规则。
- 根节点必须为黑色。原因见:Why is the root in a red-black tree always black?
搜索
由上述可知,红黑树的表现就是BST,因此搜索过程与BST完全一致。
插入
插入新节点可能会破坏原树的定义与平衡性,所以我们需要旋转和翻转颜色等操作来修复。
左旋
右旋
翻转颜色
参考
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!