红黑树

why ? what ? when ? how ?

为什么要用红黑树?

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

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

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

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

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

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

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。

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

posted @ 2018-07-24 10:02  罗贱人  阅读(221)  评论(0编辑  收藏  举报