红黑树和二叉查找树

https://www.bilibili.com/video/BV1tE411f7tP?p=1
本博客根据图灵诸葛老师的讲的,把自己的理解写出来。

查找算法有哪些

要想理解红黑树,首先要理解查找算法有哪些

  1. 暴力,就是利用for循环,比如循环遍历链表
  2. 二分查找,注意一定要有序才能进行二分查找
  3. 哈希,最高效,时间复杂度为O(1)。但是容易产生hash冲突,hashmap就是利用了hash查找,JDK1.8之后,hashmap结构为数组+链表+红黑树(链表长度大于8)
  4. 索引
  5. 平衡树
  6. B+树
  7. B-tree
  8. 红黑树
  9. 二叉查找树

思考:

怎么用二分查找

比如现在有 一个56这个数,现在你们从1-100里面猜一个数,怎么才能最快猜出来是56呢,不错,肯定是先猜50这个数,很显然50<56,所以56这个数只能在50-100里面猜,所以第二次猜75,75>56,所以这个数肯定在50-75之间,以此类推,就可以找出来56这个数。

二叉查找树

所以二叉查找树就是这样来的,看下面这个图。

二叉查找树
左边的字节点肯定小于父节点。右边的子节点大于父节点。比如我们要在这个树里面查找8,怎么查找呢?先查找5,8>5,所以8在5的右节点,下一层是11,8<11,所以在8的左节点。有没有发现什么规律。是的,二叉查找树是根据二分法来实现的,那么它的时间复杂度是多少呢?是不是我们要查找8,需要查找3次,不难看出,查找的次数=树的深度。所以可以得出来二叉查找树的时间复杂度是log n(总个数),比如8个数中找一个数,要查找2^3 = 8 ,查找3次。

出现的问题

上面讨论的是每个节点都有两个子节点,有意外情况的发生,比如下面这个图
在这里插入图片描述
这个也满足右节点大于父节点。但是这样的话需要查找几次啊?不错,查找次数=数个数。这样就没有设计的意义了,为了解决这一种情况出现了红黑数,其实特别简单。不要把问题复杂化。

红黑树

红黑树的性质

  1. 每个节点不是红色就是黑色
  2. 不能有两个连着的红节点。
  3. 最后的子节点必须都是黑色
    上图,这就是个简单的红黑树
    在这里插入图片描述
    注意:新插入的节点必须是红色
    红黑树也满足二分查找树,为了满足红黑数的性质就出现了旋转:
    有三种变换规则:
    改变颜色,红变黑,或者黑变红
    左旋
    右旋

旋转颜色的变化规则

当前节点的父节点是红色,并且他的祖父节点的另一个子节点也是红色(叔叔节点)
在这里插入图片描述

(1)把父节点变成黑色,就是把7这个节点变成黑色
(2)把叔叔节点也变成黑色,就是把13这个节点变成黑色。
(3)把爷爷节点,也就是12这个节点变成红色。

左旋

当前父节点是红色,并且叔叔节点是黑色的时候,并且当前节点是右子树。在这里插入图片描述

在这里插入图片描述

右旋

当前父节点是红色,叔叔节点是黑色,并且是左子树

在这里插入图片描述
所以最终结果就是这样的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值