3.3.2 红黑二叉查找树
2-3查找树的实现采用红黑二叉树的简单数据结构来表达;
用这样的数据结构表达,代码量不大;
3.3.1.1 红黑二叉树表达2-3查找树
由一条红色左链接相连的里那个2-节点表示一个3-节点;
黑链接是2-3树中的普通链接;
没有任何一个节点同时和两条红链接相连;(红链接均为左链接)
该树是完美黑色平衡树,即任意空连接到根节点的路径上的黑链接数量相同;
Node节点中有一个表示颜色的布尔变量color,如果指向该节点的连接是红色的,则color变量为true,黑色则为false;
只允许红色左链接的存在,可以减少可能出现的情况,减少代码量;
3.3.1.5旋转
当出现红色右链接、出现连续的两条红链接时,需要对红链接做旋转操作;
将红色右链接变为红色左链接,成为左旋转;将红左链接变为红右链接是右旋转;
普通插入操作要用到旋转操作;
旋转不影响树的有序性、完美平衡性;
3.3.1.7向2-节点下插入新键
小于老键,直接增加一个红链接节点;
大于老键,增加红右链接,左旋转;如果老键不是根节点则要修正指向老键的连接;
3.3.1.9向3-节点下插入新键
新键最大:在插入位置增加红右链接,将红左链接和红右链接颜色变为黑;
新键最小:在插入位置增加红左链接(连续的两条红左链接),右旋转上层链接(红左红右),将红左链接和红右链接颜色变为黑;
新建介于两者之间:在插入位置增加红右链接(连续的一条红左,一条红右),左旋转下层链接(连续的两条红左链接),右旋转上层链接(红左红右),将红左链接和红右链接颜色变为黑;
创建临时的4-节点,将其分解将(中间值)红链接转移到父节点,重复这个过程,直到遇到2-节点或根节点;
3.3.1.10颜色转换
颜色转换方法flipColors(),将父节点颜色由黑变红(表示将该4-节点的中间节点取出加入其父节点),将颜色由红变黑(左右链接分别指向2-节点);
根节点总是黑色(每次插入后都将根节点设置为黑色);
当根节点由红变黑时黑链接高度加1;
3.3.1.13将红链接在树中向上传递
右子节点是红色左子节点是黑色:左旋转;
左子节点的是红色,左子节点的左子节点是红色:右旋转;
左右子节点是红色:颜色转换;
3.3.3 实现
红黑树的插入操作put(),与二叉查找树的put()实现,除了递归语句的后三条if语句,其他都相同。
如果右子节点是红色左子节点是黑色:左旋转;
如果左子节点的是红色,左子节点的左子节点是红色:右旋转;
如果左右子节点是红色:颜色转换;
3.3.4 删除操作
3.3.4.2删除最小键
删除树底部的3-节点:直接删除;
删除树底部的2-节点:如果直接删除,则连接变为空连接,破坏了树的平衡性;要保证当前节点不是2-节点;操作如下:
1) 如果当前节点左子节点是2-节点,左子节点的亲兄节点不是2-节点,将亲兄节点中的一个键移入父节点,父节点最小键移入左子节点中,(父节点结点类型不变);
2) 如果当前节点左子节点是2-节点,左子节点的亲兄节点也是2-节点,将父节点中的最小键移入左子节点,将左子节点的最近邻亲兄节点移入左子节点,(左子节点变为4-节点,父节点由3-变为2-,或者由4-变为3-);
3.3.4.3删除
如果被删除的键不再树的底部,将它和它的后继节点交换,和二叉查找树一样。
3.3.5 红黑树性质
一棵大小为N的红黑树,高度不超过2lgN;
一棵大小为N的红黑树,根节点到任意结点的平均路径长度为~1.00lgN
红黑树实现中最复杂的代码时插入put()和删除delete(),查找最大/小键、select()、rank()、floor()、ceiling()和范围查找方法,和二叉查找树一样