hololive滚滚山免安装绿色中文版
995M · 2025-10-31
在学习 C++ STL 的时候,我们总会碰到这样一件事:
map、set 这些容器,查找、插入、删除的复杂度都是 O(log n) ,而且还能保持有序。
这背后的“功臣”,就是 红黑树(Red-Black Tree) 。
那么问题来了:红黑树究竟是个啥?为什么它能这么高效?今天我们就好好拆解一下。
红黑树是一种 自平衡二叉搜索树。
换句话说,它就是一种二叉搜索树(BST),但在插入或删除时,会自动做一些“旋转、变色”的操作,来保证树的高度不会退化。
为什么要搞“平衡”?
所以,它是介于“性能”和“实现复杂度”之间的一个折中方案。
红黑树之所以能保持平衡,靠的是一套规则:
这些规则确保了:
最终,红黑树的高度最多是 2 * log2(n+1),保证查找、插入、删除都是 O(log n) 。
当我们往树里插入一个新节点时,可能会破坏红黑树的平衡。
修复的方式主要有两种:
比如,当一个红节点插到红节点下面,就违反了“不能连续两个红”的规则,这时可能就需要“叔叔变色”或者“父亲旋转”。
很多教材在这里会配图展示插入时的各种情况(父红叔黑 / 父红叔红等),这就是红黑树实现里最复杂的部分。
红黑树之所以“大名鼎鼎”,在前面也可以看出来了,它很实用。
在很多编程语言的标准库中,它都是底层支柱:
map、set、multimap、multisetTreeMap、TreeSet凡是需要 有序、可快速查找/插入/删除 的场景,红黑树都是首选。
有人可能会问:这不是还有 AVL 树、Splay 树等一众好树嘛,为什么就只有红黑树如此受欢迎?我们来稍稍对比以下就知道了。
这也是为什么 C++ STL、Java 都选了红黑树作为底层实现。
所以说,红黑树并不是“最平衡”的树,但却是工程上最实用的平衡树之一。
 
                     
                            995M · 2025-10-31
 
                            90.9M · 2025-10-31
 
                            478M · 2025-10-31
