截取自算法(第四版)
替换3-节点:
红黑二叉查找树背后的基本思想是用标准二叉查找树(完全由2-节点构成)和一些额外的信息(替换3-节点)来表示2-3树。
红黑树中的链接分为两种:
1、 将两个2-节点连接起来构成3-节点的红链接
2、 2-3树中的普通链接为黑链接
将两个-2节点用左斜的红色链接链起来可表示3-节点
一种等价的定义:
一一对应
1、 如果将一颗红黑树中的红链接画平,那么所有的空链接到根节点的距离都是相同的
2、 如果将由红链接相连的节点合并,得到的就是一颗2-3树
3、 红黑树即是二叉查找树又是2-3树
颜色表示
增加一个颜色域,以表示指向该节点(从他的双亲节点指过来)的链接的颜色。
如果指向该节点的链接是红色的,该节点的颜色域内应该表示为红色,否则表示为黑色
我们约定,空链为黑色。
注:当提及一个节点的颜色时,指的是指向该节点的链接的颜色
旋转
在实现某些操作时可能出现红色右链接或是两条连续的红链接,这是不符合红黑树定义的,我们需要对其进行旋转操作,以改变红链接的方向。
左旋转
动画:
右旋转
动画:
旋转操作:
1、 只是将两个键中的较小者作为根节点变为将较大者作为根节点。
2、 可以保持红黑树的重要性质:有序性、完美平衡、不存在两条连续的红链接、不存在红色的右链接。
向2-节点插入新键
1、 如果新键小于老键,新增一个红色节点,添加后新的红黑树和单个3-节点完全等价
2、 如果新键大于老键,那么新增的红色节点会产生一条红色右链接,需要将其左旋转来修正红色右链接,修正根节点的连接
注:当插入新节点时,总是用红链接将它与双亲节点链接
向一个3-节点插入新键:
将其分为三种情况:
1、新键小于树中的两个键2、新键大小在两者之间3、新键大于树中的两个节点
这三种情况都会产生两条红链接同时链接一个节点的情况,我们应该旋转以修正它:
1) 新键大于原树中的两个键,新键被链接到3-节点的右节点,此时树是平衡的,根节点为中间大小的键,它有两条红链分别和较小、较大的节点相链。将两条红链的颜色变黑,就得到了一颗由三个节点组成,高为2的平衡树。且能对应一颗2-3树。
即:新节点的链接是3-节点的右链接,转换颜色即可
2) 新键小于原树中的两个键,新键被链接到最左边的空链,这时产生了两条连续的左红链,将上层的红链接右旋转使树转换为第(1)种情况
即:新节点的链接是3-节点的左链接,右旋转上层链接再转换颜色
3) 新键介于原树中的两个键之间,也会产生两条连续的红链接,一条左红链接一条右红链接,将下层的红链接左旋转使树转换为第(2)种情况
即:新节点的连接时3-节点的中链接,左旋转下层链接,接着右旋转上层,再转 换颜色
颜色转换:
当原树中根节点各链接出去一个红色链接时,我们应该转换链接的颜色。将链接出去的左右红链接变黑,再将链接到根的链接变红。即将子节点颜色由红变黑,将父节点的颜色由黑变红。
颜色的变换是局部的,不会影响整棵树的黑色平衡性。
将红色链接在树中向上传递
红黑树构造动画:
性能总结:
以升序键插入构造红黑二叉查找树
以降序键插入构造红黑二叉查找树
随机插入构造红黑二叉查找树