红黑树(1)

红黑树的性质:

  • 性质1:每个节点要么是黑色,要么是红色;
  • 性质2:根节点是黑色。
  • 性质3:每个叶子节点(NIL)是黑色(虚拟存在的)。
  • 性质4:每个红色结点的两个子结点一定都是黑色。
  • 性质5:任意一结点到每个叶子结点的路径都包含数量相同的黑结点,俗陈:黑高!

从性质5又可以推出:

  • 性质5.1:如果一个结点存在黑子结点,那么该结点肯定有两个子结点

在这里插入图片描述
红黑树并不是一个完美平衡二叉查找树,从图1可以看到,根结点P的左子树显然比右子树高,但左子树和右子树的黑结点的层数是相等的,也即任意一个结点到到每个叶子结点的路径都包含数量相同的黑结点(性质5)。所以我们叫红黑树这种平衡为黑色完美平衡。
红黑树的自动平衡靠三种操作:变色,左旋,右旋

  • 左旋:以某个结点作为支点(旋转结点),其右子结点变为旋转结点的父结点,右子结点的左子结点变为旋转结点的右子结点,-左子结点保持不变。如图2。
  • 右旋:以某个结点作为支点(旋转结点),其左子结点变为旋转结点的父结点,左子结点的右子结点变为旋转结点的左子结点,右子结点保持不变。如图3。
  • 变色:结点的颜色由红变黑或由黑变红。
    左旋图示
    图2 左旋

左旋动态图

右旋图示:
在这里插入图片描述
在这里插入图片描述

红黑树查找

因为红黑树是一颗二叉平衡树,并且查找不会破坏树的平衡,所以查找跟二叉平衡树的查找无异:

  • 从根结点开始查找,把根结点设置为当前结点;
  • 若当前结点为空,返回null;
  • 若当前结点不为空,用当前结点的key跟查找key作比较;
  • 若当前结点key等于查找key,那么该key就是查找目标,返回当前结点;
  • 若当前结点key大于查找key,把当前结点的左子结点设置为当前结点,重复步骤2;
  • 若当前结点key小于查找key,把当前结点的右子结点设置为当前结点,重复步骤2;
    查找流程图

红黑树的插入

插入操作包括两部分工作:一查找插入的位置;二插入后自平衡。查找插入的父结点很简单,跟查找操作区别不大:

  • 从根结点开始查找;
  • 若根结点为空,那么插入结点作为根结点,结束。
  • 若根结点不为空,那么把根结点作为当前结点;
  • 若当前结点为null,返回当前结点的父结点,结束。
  • 若当前结点key等于查找key,那么该key所在结点就是插入结点,更新结点的值,结束。
  • 若当前结点key大于查找key,把当前结点的左子结点设置为当前结点,重复步骤4;
  • 若当前结点key小于查找key,把当前结点的右子结点设置为当前结点,重复步骤4;

插入流程图
**插入的节点必须为红色!!**理由很简单,红色在父结点(如果存在)为黑色结点时,红黑树的黑色平衡没被破坏,不需要做自平衡操作。但如果插入结点是黑色,那么插入位置所在的子树黑色结点总是多1,必须做自平衡。
红黑树插入节点的情景分析
约定如下:
在这里插入图片描述
情景一:红黑树为空树!
最简单的一种情景,直接把插入结点作为根结点就行。
注意:根据红黑树性质2:根节点是黑色。还需要把插入结点设为黑色。

情景二:插入结点的key已存在!
处理:更新当前节点的值,为插入节点的值。
在这里插入图片描述
情景三:插入结点的父节点为黑结点!
由于插入的结点是红色的,当插入结点的父节点为黑结点时,并不会影响红黑树的平衡,直接插入即可,无需做自平衡。
在这里插入图片描述
情景四:插入结点的父结点为红色!
再次回想下红黑树的性质2:根结点是黑色。如果插入的父结点为红结点,那么该父结点不可能为根结点,所以插入结点总是存在祖父结点。这点很重要,因为后续的旋转操作肯定需要祖父结点的参与。

  • 情景4.1 叔叔结点存在并且为红结点

  • 从红黑树性质4可以,祖父结点肯定为黑结点,因为不可以同时存在两个相连的红结点。那么此时该插入子树的红黑层数的情况是:黑红红。显然最简单的处理方式是把其改为:红黑红。

  • 处理:将P和S设置为黑色、将PP设置为红色、把PP设置为当前插入结点

  • 在这里插入图片描述

  • 情景4.2 叔叔结点不存在或为黑结点,并且插入结点的父亲结点是祖父结点的左子结点

  • 注意:单纯从插入前来看,叔叔节点非红即空(NIL节点),否则的话破坏了红黑树性质5,此路径会比其它路径多一个黑色节点。
    在这里插入图片描述
         情景4.2.1 插入结点是其父结点的左子结点
         处理:将P设为黑色、将PP设为红色、对PP进行右旋!
         在这里插入图片描述
        情景4.2.2 插入结点是其父结点的右子结点
        处理:对P进行左旋、把P设置为插入结点,得到情景4.2.1、进行情景4.2.1的处理
        在这里插入图片描述
    情景4.3 叔叔结点不存在或为黑结点,并且插入结点的父亲结点是祖父结点的右子结点
    该情景对应情景4.2,只是方向反转,不做过多说明了,直接看图。
    在这里插入图片描述
        情景4.3.1 插入结点是其父结点的右子结点
        处理:将P设为黑色、将PP设为红色、对PP进行左旋
        在这里插入图片描述
        情景4.3.1 插入结点是其父结点的左子结点
        处理:对P进行右旋、把P设置为插入结点,得到情景4.3.1、进行情景4.3.1的处理
        在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值