关于红黑树:了解是什么? 为什么设计? 会有什么效果? 什么时候用?

201 阅读2分钟

了解是什么?

红黑树(Red-Black Tree)是一种自平衡的二叉搜索树,它在每个节点上增加了一个存储位表示节点的颜色,可以是红色或黑色。通过遵循一定的规则,红黑树保持了良好的平衡性质,使得其在插入、删除和查找等操作的时间复杂度能够保持在对数级别。

红黑树具有以下特性:

  1. 每个节点都有一个颜色,要么是红色,要么是黑色。
  2. 根节点是黑色的。
  3. 每个叶子节点(NIL节点,空节点)是黑色的。
  4. 如果一个节点是红色的,则它的两个子节点都是黑色的。
  5. 对于每个节点,从该节点到其子孙节点的所有路径上包含相同数目的黑色节点。

这些特性保证了红黑树的平衡性质,使得最长路径不会超过最短路径的两倍,从而保证了红黑树的高度始终在对数级别,提供了较快的查找、插入和删除操作。

红黑树在计算机科学中广泛应用,特别适合于需要高效地插入和删除节点,并且需要保持有序性的数据结构场景。在许多编程语言的标准库中都可以找到红黑树的实现,如C++的STL中的mapset容器,Java的TreeMapTreeSet等。

总之,红黑树是一种自平衡的二叉搜索树,通过遵循特定的规则保持了树的平衡性质,提供了高效的插入、删除和查找操作。它是一种重要的数据结构,在算法和软件开发中发挥着重要的作用。

为什么设计?

红黑树存在的意义是为了解决二叉树查找的缺陷

会有什么效果?

假设你计算机里存有十亿个身份证信息,你要用计算机在这些身份证信息里进行增加、删除、查找等操作,应该怎样设计程序实现这些功能?最简单的笨办法,当然是逐条比对,但是这样的操作要进行平均 次比对,也就是平均5亿次。如果应用红黑树,就只要最多 次比对,也就是最多30次。30次 vs 5亿次,程序性能提升了1600多万倍。

什么时候用?

JDK的集合类TreeMap和TreeSet底层就是红黑树,在java8中,HashMap也用到了红黑树。linux下的select有应用;STL有应用;java里的好几个数据结构也应用。