排序二叉树虽然效率较高,可以快速 的检索,但是当要插入的节点本身就是有序的,那么所有的节点构成链表。如果插入的节点本身按照从大到小的顺序插入,那么所有节点都只有左子节点,如果节点本身按照从小到大的顺序排列,那么所有节点都只有右子节点,排序二叉树变为普通的链表,此时其检索效率就会很低。
为了改进排序二叉树的不足,本文从2-3查找树谈起,构造一种二分查找树——红黑树,介绍红黑树的插入删除等操作。
1、2-3查找树
2-3树是最简单的B-树(或-树)结构,其每个非叶节点都有两个或三个子女,而且所有叶都在统一层上。2-3树不是二叉树,其节点可拥有3个孩子。不过,2-3树与满二叉树相似。高为h的2-3树包含的节点数大于等于高度为h的满二叉树的节点数,即至少有2^h-1个节点。
1.1 2-3查找树的定义
一棵2-3查找树或为一棵空树,或由以下节点组成:
- 2-节点:含有一个键(及其对应的值)和两条链接,左链接指向的2-3树中的键都小于该节点,右链接指向的2-3树中的节点都大于该节点。
- 3-节点:含有两个键(及其对应的值)和三个链接,左链接指向的2-3树中的键都小于该节点,中链接指向的键都位于该节点的两个键之间,右链接指向的2-3树中的节点的键都大于该节点。
2-3查找树如下图所示:
1.2 2-3查找树的查找
要查找一个键,首先判断它和根节点的键是否相等,若相等则查找命中,否则根据比较的结果在相应的子区间继续递归查找,如果是空连接,查找未命中。
1.3 2-3查找树的插入
1.3.1 向2-节点中插入新键
1.3.2 向一棵只含有一个3-节点的树中插入新键
1.3.3 向一个父节点为2-节点的3-节点中插入新键
1.3.4 向一个父节点为3-节点的3-节点中插入新键
1.3.5 分解根节点
如果从插入节点到根节点的路上全都是3-节点那么根节点最终变为一个临时的4-节点,此时需要将此4-节点分解,将一个4-节点分解为2-3树可能有6中情况:
1.4 2-3查找树的简要总结
- 局部变换:2-3查找树的以上这些操作都是局部的:除了相关的节点和链接外。不必处理其他的节点和链接。每次变换,需要处理的链接数量不会超过一个很小的常数,并且树中任何地方,只要符合相应的模式,都可以进行相应的变换。
- 全局性质:以上局部变换不会影响树的全局有序性和平衡性,任意空链接到根节点的路径长度都是相等的。
- 在一棵大小为N的2-3树中,查找和插入操作访问的节点必然不超过lgN个。
但是实现2-3查找树的操作,我们需要维护两种不同类型的节点,实现这些操作需要处理的情况大大增加,实现的代码量较大,为此,我们介绍一种红黑二叉查找树的数据结构来表达实现。