why ? what ? when ? how ?
为什么要用红黑树?
红黑树放弃了追求完全平衡,追求大致平衡,任何不平衡都会在3次旋转之内解决,平衡二叉树不行。
Red Black Tree 是一种自平衡的二叉查找树。需要满足下面 5 个性质:
- 结点是红色或黑色
- 根结点是黑色
- 每个叶子结点都是黑色的空结点(NIL结点)
- 每个红色结点的两个子结点都是黑色(从每个叶子到根的所有路径上不能有两个连续的红色结点)
- 从任一结点到其每个叶子的所有路径都包含相同数目的黑色结点
红黑树从根到叶子的最长路径不会超过最短路径的 2 倍。
当插入或删除破坏了红黑树的规则需要通过 变色或旋转两种方式来调整。旋转又分成两种形式:左旋转和右旋转。
插入和删除的具体案例以及调整略过网上很多下面这篇讲的不错
应用
红黑树的应用有很多:其中 JDK 的集合类 TreeMap 和 TreeSet 底层就是红黑树实现的。在Java8 中,HashMap也用到了红黑树。
红黑树相比平衡二叉树优势:
红黑树能够以O(log2(N))的时间复杂度进行搜索、插入、删除操作。此外,任何不平衡都会在3次旋转之内解决,这一点是AVL所不具备的。红黑树放弃了追求完全平衡,追求大致平衡,平衡二叉树追求绝对平衡。
总结
参考
TreeMap 和 TreeSet 底层就是红黑树实现,JDK8,HashMap也用了红黑树,主要是红黑树在任何不平衡都会在3次旋转之内解决,而平衡二叉树追求绝对平衡旋转次数不可预算。红黑树调整平衡通过变色或旋转。不过红黑树自平衡的调整,插入和删除节点的时候都涉及到很多种Case。
有什么问题欢迎指出,十分感谢!