肝了几天我算是理解了红黑树

1.二叉排序树

 

    在学习红黑树之前我们需要了解一下二叉排序树,所谓二叉排序树就是一种特殊的二叉树,首先满足二叉树的性质,然后它存储数据的方式是左边节点比父节点的数据小,而右边节点比父节点数据大。这样当我们查询一个数据时,比如我们要找数据8,先从根节点开始,8比12小所以去左子树找,然后与5比较发现比5大那么去右子节点此时就找到了我们需要的数据8。是不是类似于二分查找呢?只需要O(logn)就能找到数据。

 

 

 二叉搜索树(二叉排序树,二叉树查找树),他的时间复杂度取决于树的高度,理想情况下为O(logn),但是某些情况下会退化为O(n),比如我们插入的数据为10,9,8,7,6或者是1,2,3,4,5这种情况下二叉排序树将会退化为斜树,相当于一个链表,此时查询的时间复杂度就会变为O(n),如下图所示。

 

 

2.红黑树

 

    通过上面的例子我们可以看到即便是二叉排序树十分的优秀,但是在某些情况下二叉排序树的效率会大打折扣,针对这种情况科学家们衍生除了红黑树,只要能满足以下性质就能让二叉排序树到达自平衡。

 性质1:每个节点要么是黑色,要么是红色。

 性质2:根节点是黑色。

 性质3:每个叶子节点(NIL)是黑色。

 性质4:相邻节点不能同时为红色,此处的相邻是指父节点和左右任意一个子节点不能同时为红色,从而可以推出性质5

 性质5:每个红色节点的两个子节点一定都是黑色。  

    ps:红黑树是一个黑色平衡的树,但是却不是一个完美平衡的二叉排序树,所谓的完美平衡二叉树就是指平衡因子的绝对值小于等于1,而所谓的平衡因子指的是该节点的左子树层数减去右子树层数的绝对值。黑色平衡是当我们将红黑树中的红色节点全部删除时,此时你会发现都平衡因子为小于1的。红色节点删除之后,有些节点就没有父节点了,它们会直接拿这些节点的祖父节点(父节点的父节点)作为父节点。所以,之前的二叉树就变成了四叉树。

 

 

3.红黑树的插入

 

 

 

 

 

由于场景1、2、3都比较简单,所以就就没有细讲,可以对照着上图的思维导图进行了解,下面主要介绍的是场景4的,场景4都涉及到左旋,右旋以及变色的处理;首先我们要知道红黑树在插入节点时默认插入的节点为红色,这是因为如果我们默认插入为黑色,那么就会导致不满足性质5,也就是任意节点到每个叶子节点经历的黑色节点一致。

 

插入场景4.1

 

   插入节点的父为红色且叔叔节点存在,并且叔叔为红色节点。

   处理:我们只需要将父节点和叔叔节点变为黑色,同时祖父节点变为红色,如果将祖父节点变为红色后,此时可能出现祖父节点和自己的父节点又不平衡,所以我们还需要继续调整。

   注意:   如果祖父节点为根节点,此时不需要改变为红色,如果改变那么就不满足红黑树的性质。

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
红黑树的删除操作需要进行调整,以保证删除节点后仍然满足红黑树的性质。删除操作涉及到三种情况: 1. 删除节点没有子节点 这种情况比较简单,只需要将待删除节点替换成空节点,并将其颜色设为黑色即可。如果待删除节点是红色节点,那么删除后不会影响红黑树的性质;如果待删除节点是黑色节点,那么删除后会破坏红黑树的性质,需要进行调整。 2. 删除节点只有一个子节点 这种情况需要将待删除节点的子节点替换成待删除节点,并将待删除节点的颜色赋给子节点。如果待删除节点是黑色节点,那么删除后会破坏红黑树的性质,需要进行调整。 3. 删除节点有两个子节点 这种情况比较复杂,需要找到待删除节点的后继节点,将后继节点的值赋给待删除节点,并将后继节点删除。后继节点要么是待删除节点的右子树中的最小节点,要么是待删除节点的左子树中的最大节点。删除后继节点可能会破坏红黑树的性质,需要进行调整。 下面是红黑树删除的具体调整操作: 1. 如果删除的节点是红色节点,那么删除后不会破坏红黑树的性质,直接删除即可。 2. 如果删除的节点是黑色节点,并且其子节点是红色节点,那么可以将子节点涂黑代替删除节点,并不会破坏红黑树的性质。 3. 如果删除的节点是黑色节点,并且其子节点都是黑色节点,那么需要进行调整。设待删除节点为x,x的兄弟节点为s,x的父节点为p。此时需要分为以下三种情况: (1) x是左子节点,s是右子节点 此时需要进行左旋操作。将p作为新的子树根节点,s作为p的左子节点,x的兄弟节点s的右子节点作为s的左子节点。 (2) x是右子节点,s是左子节点 此时需要进行右旋操作。将p作为新的子树根节点,s作为p的右子节点,x的兄弟节点s的左子节点作为s的右子节点。 (3) x是左子节点,s是左子节点或者x是右子节点,s是右子节点 此时需要进行重新着色操作。将x的兄弟节点s的颜色涂成红色,将x的父节点p的颜色设为黑色,删除节点x。 最后,需要检查删除节点红黑树的性质是否仍然满足,如果不满足需要进行相应的调整操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值