红黑树

why ? what ? when ? how ?

为什么要用红黑树?

红黑树放弃了追求完全平衡,追求大致平衡,任何不平衡都会在3次旋转之内解决,平衡二叉树不行。

Red Black Tree 是一种自平衡的二叉查找树。需要满足下面 5 个性质:

  1. 结点是红色或黑色
  2. 根结点是黑色
  3. 每个叶子结点都是黑色的空结点(NIL结点)
  4. 每个红色结点的两个子结点都是黑色(从每个叶子到根的所有路径上不能有两个连续的红色结点)
  5. 从任一结点到其每个叶子的所有路径都包含相同数目的黑色结点

红黑树从根到叶子的最长路径不会超过最短路径的 2 倍。

ScJ9zQ4.jpg

当插入或删除破坏了红黑树的规则需要通过 变色或旋转两种方式来调整。旋转又分成两种形式:左旋转和右旋转。

插入和删除的具体案例以及调整略过网上很多下面这篇讲的不错

http://www.cnblogs.com/skywang12345/p/3245399.html

应用

红黑树的应用有很多:其中 JDK 的集合类 TreeMap 和 TreeSet 底层就是红黑树实现的。在Java8 中,HashMap也用到了红黑树。

红黑树相比平衡二叉树优势:

红黑树能够以O(log2(N))的时间复杂度进行搜索、插入、删除操作。此外,任何不平衡都会在3次旋转之内解决,这一点是AVL所不具备的。红黑树放弃了追求完全平衡,追求大致平衡,平衡二叉树追求绝对平衡。

总结

参考

https://www.sohu.com/a/201923614_466939

TreeMap 和 TreeSet 底层就是红黑树实现,JDK8,HashMap也用了红黑树,主要是红黑树在任何不平衡都会在3次旋转之内解决,而平衡二叉树追求绝对平衡旋转次数不可预算。红黑树调整平衡通过变色或旋转。不过红黑树自平衡的调整,插入和删除节点的时候都涉及到很多种Case。

有什么问题欢迎指出,十分感谢!

转载于:https://www.cnblogs.com/rookieJW/p/9358427.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值