平衡二叉树,在一棵含有N个节点的树中,树高为~lgN,所有查找都能够在~lgN次比较内结束,和二分查找一样。
2-3查找树
标准二叉查找树中的节点称为2-节点(含有一个键和两条链接),现在引入3-节点,含有两个键和三条链接。
2-3树的生长是由下往上的。
向2-节点中插入新键
先进行一次未命中的查找,把新节点挂在树的底部。如果未命中的查找结束于一个2-节点,只需要把这个2-节点替换为3-节点,将要插入的值保存在其中即可。
向一颗只含有3-节点的树中插入新键
为了将新键插入,先临时将新键存入该结点,使之成为一个4-节点,然后将它转换为3个2-节点组成的2-3树。
向一个父节点为2-节点的3-节点插入新键
先构造一个临时的4-节点并将其分解,但此时不会为中键创建一个新节点,而是将其移动至原来的父节点中。
向一颗父节点为3-节点的3-节点中插入新键
构造一个临时的4-节点并分解它,然后将它的中键插入到它的父节点中。但父节点也是一个3-节点,再构造一个临时4-节点,并重复上面步骤,直至遇到一个2-节点并将它替换为不需要继续分解的3-节点,或者是到达3-节点的根。
分解根节点
按照向一颗只有3-节点的树中插入新键的方法来处理这个问题,此时,树高加1。
红黑二叉查找树(红黑树)
红黑二叉查找树的基本思想是用标准的二叉查找树(完全由2-节点组成)和一些额外的信息(替换3-节点)来表示2-3树。链接分为两种类型,红链接将两个2-节点连接起来构成一个3-节点,黑链接则是普通链接。确切地说,将3-节点表示为由一条红色链接相连的两个2-节点。
红黑树有以下特性(等价定义):
红链接均为左链接
没有任何一个节点同时和两条红链接相连
该树是完美黑色平衡的,即任意空链接到根节点的路径上的黑链接数量相同。
一颗红黑树和一颗平衡二叉树一一对应。
一个节点的颜色是指向该结点链接的颜色。
旋转
当出现红色右链接或者连续两条连续的左链接时,需要进行旋转操作。
旋转之后需要重置父节点的链接。
向单个2-节点中插入新键
插入一个键之后,需要马上将他们进行旋转。如果新键小于老键,只需要新增一个红色的节点即可。如果新键大于老键,新增的红色节点将会产生一条红色的右链接,此时需要旋转。
向树底部的2-节点插入新键
此时会在树的底部新增一个节点,但总是用红链接将新节点将新节点和它的父节点相连。如果它的父节点是一个2-节点,可以用上面一个步骤处理。如果指向新节点的是父节点的左链接,那么父节点就直接成为一个3-节点;如果指向新节点的是父节点的右链接,这就是一个错误的3-节点,但一次左旋转就能够修正它。
向一个3-节点中插入新键
新键大于原树中的两个键:此时一个节点有两条红链接,需要将两条链接都由红变黑,就得到一颗由三个节点组成、高为2的平衡树。
新键小于原树中的两个键:此时产生两条连续的红链接,将上层的红链接右旋转即可得到第一种情况。
新键介于原树中的两个键:此时产生两条连续的红链接,一条红色左链接和一条红色右链接。将下层的红链接左旋转即可得到第二种情况。
颜色转换
在将一个节点的两个子节点由红转黑的同时,还需要将该结点自身的颜色由黑转红。
根节点总是黑色的。当根节点由红变黑时,树的黑链接高度就会加1.
向树底部的3-节点插入新键
处理方法和向一个单独的3-节点中插入新键一样,不同的是,在这里,颜色转换会使到中节点的链接变红,相当于把它送入了父节点。这意味着在父节点中继续插入一个新键,如果需要,可以递归处理这个问题。
变换总结
如果右子节点是红色的而左子节点是黑色的,进行左旋转;
如果左子节点是红色且它的左子节点也是红色的,进行右旋转;
如果左右节点均为红色,进行颜色转换。