红黑树的优势_红黑树,超强动静图详解,简单易懂

写在前面

红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。

红黑树是在1972年由Rudolf Bayer发明的,当时被称为平衡二叉B树(symmetric binary B-trees)。后来,在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的“红黑树”。

红黑树是一种特化的AVL树(平衡二叉树),都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。

它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的:它可以在O(log n)时间内做查找,插入和删除,这里的n 是树中元素的数目。

5c04d74984268c6b8a8d48c7b8efa751.gif

俺家司令买完东西后,我俩经常会发生这样的一段对话:

司令:你猜我买的这个多少钱? 我: 1000
司令: 高了 我: 500
司令: 低了: 我: 750
...... 直到最后猜中

这样说大家应该已经猜到了是「二分查找法」,通过这个例子我想要引出的是 树,来看图片

974575cb0f0ccd3907745df712e6ca73.png

程序中的树其实是我们日常看到的树的倒影,或者发挥一下想象,倒影也可以是树根

红黑树

假设我们插入的新节点为 X

  1. 将新插入的节点标记为红色

  2. 如果 X 是根结点(root),则标记为黑色

  3. 如果 X 的 parent 不是黑色,同时 X 也不是 root:

  • 3.1 如果 X 的 uncle (叔叔) 是红色

    • 3.1.1 将 parent 和 uncle 标记为黑色

    • 3.1.2 将 grand parent (祖父) 标记为红色

    • 3.1.3 让 X 节点的颜色与 X 祖父的颜色相同,然后重复步骤 2、3

话不多说,看下图

9fa3b5b85e33410d944a48515a6a2b82.png

跟着上面的公式走:

  1. 将新插入的 X 节点标记为红色

  2. 发现 X 的 parent (P) 同样为红色,这违反了红黑树的第三条规则「不能有两个连续相邻的红色节点」

  3. 发现 X 的 uncle (U) 同样为红色

  4. 将 P 和 U 标记为黑色

  5. 将 X 和 X 的 grand parent (G) 标记为相同的颜色,即红色,继续重复公式 2、3

  6. 发现 G 是根结点,标记为黑色

  7. 结束

当出现 uncle 是黑色的时候我们第一步要考虑的是 旋转 ,这里先请小伙伴不要关注红黑树的第 4 条规则,主要是为了演示如何旋转的,来一点点看,不要看图就慌,有解释的 :

情况如下

这种情况很简单,想象这是一根绳子,手提起 P 节点,然后变色即可

bee9d6d49efd455f9a65b1f700d34bb2.png

左右

左旋: 使 X 的父节点 P 被 X 取代,同时父节点 P 成为 X 的左孩子,然后再应用 左左情况

1e8d84ff9c599aa98df9340ae208f04e.png

右右

与左左情况一样,想象成一根绳子

af1f19dcb6da5fd11e652fc839c09f02.png

右左

右旋: 使 X 的父节点 P 被 X 取代,同时父节点 P 成为 X 的右孩子,然后再应用 右右情况

b0091cca140f493137f35634399e2bd4.png

你说的动图在哪里,你个大骗子,别着急,现在就为小伙伴们奉上动图演示,来说明公式的使用:

案例一

插入 10,20,30,15 到一个空树中
  1. 向空树中第一次插入数字 10,肯定是 root 节点

  2. root 节点标记成黑色

  3. 032759755cc64124f6e5fd16002cc699.png

  4. 向树中插入新节点 20,标记为红色

  5. 20 > 10,并发现 10 没有叶子节点,将新节点 20 作为 10 的右孩子

  6. 3aa30aaf4dee90f3d7014afe6bef2e08.gif

  7. 向树中插入新节点 30,标记为红色

  8. 30 > 10,查找 10 的右子树,找到 20

  9. 30 > 20,继续查找 20 的右子树,发现 20 没有叶子节点,将值插在此处

  10. 30 和 20 节点都为红色,30 为右孩子,20 也为右孩子,触发了 右右情况

  11. 通过一次旋转,提起 20 节点

  12. 20 节点是根结点,标记为黑色

093b411725ec698a4b73b22a99999332.gif

  1. 向树中插入新节点 15,标记为红色

  2. 通过比对大小和判断是否有叶子节点,最终插值为 10 节点的右孩子

  3. 15 和 10 节点都为红色,15 的 uncle 节点 30 也为红色

  4. 按照公式,将 15 的 parent 10 和 uncle 30 更改为黑色

  5. 让 15 节点 grand parent 20 的颜色与 15 节点的颜色一样,变为红色

  6. 20 为根结点,将其改为黑色

  7. 7ac99919262e68302bb4c2a3ae6927dc.gif

  8. 继续插入其他节点只不过反复应用上面的公式,上面应用到的红黑树工具,可以暂停动画效果,一帧一帧的看红黑树的转换过程,这样通过练习,查看公式,观察变化三管齐下,红黑树的入门理解应该完全不再是问题了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值