《算法》-3.3平衡查找树(2)

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()和范围查找方法,和二叉查找树一样


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值