【发布时间】:2015-07-02 00:42:14
【问题描述】:
我想了解红黑树的工作原理。我了解算法,如何在插入和删除操作后修复属性,但我不清楚。为什么红黑树比二叉树更平衡?我想了解直觉,为什么旋转和固定树属性会使红黑树更加平衡。
谢谢。
【问题讨论】:
标签: algorithm binary-tree red-black-tree
我想了解红黑树的工作原理。我了解算法,如何在插入和删除操作后修复属性,但我不清楚。为什么红黑树比二叉树更平衡?我想了解直觉,为什么旋转和固定树属性会使红黑树更加平衡。
谢谢。
【问题讨论】:
标签: algorithm binary-tree red-black-tree
虽然已经很晚了,但是由于我最近正在研究 RBT,并且一直在努力思考为什么一些神奇的旋转和着色可以平衡树并且正在思考与 OP 相同的问题
为什么旋转和固定树属性会使红黑树更平衡
经过几天的“研究”,我有了灵光乍现的时刻,决定把它写详细。我不会在这里复制粘贴,因为有些格式不对,所以有兴趣的人可以从github查看。我试图用大量的图像和模拟来解释。希望有一天它对碰巧在这个线程中搜索相同问题的人有所帮助:)
【讨论】:
为什么红黑树比二叉搜索树更平衡?
因为红黑树保证了任何操作顺序的插入、删除和查找的 O(logN) 性能。
为什么旋转和固定树属性会使红黑树更加平衡?
除了任何二叉搜索树都必须遵守的一般性质外,红黑树还遵守以下性质:
现在我们要证明以下命题:
提议。在最坏的情况下,树的高度≤2 lg N。
证明。
由于从根到任何空链接的每条路径都具有相同数量的黑色链接,并且两个红色链接永远不会在一行中,因此在最坏的情况下,最大高度将始终小于或等于 2logN。
【讨论】:
假设您通过按顺序插入以下项目来创建一个普通二叉树:1、2、3、4、5、6、7、8、9。每个新项目将始终是树中最大的项目,并且所以作为最右边的节点插入。你的“树”看起来像这样:
1
\
2
\
3
.
.
.
9
在红黑树(或任何类型的平衡二叉树)中执行的旋转确保任何节点的左子树和右子树都不会比另一个更深(通常,高度差为 0 或 1,但是任何常数因素都可以。)这样,运行时间取决于树的高度h的操作总是O(lg n),因为旋转保持h = O(lg n)的属性,而在上面显示的最坏情况下h = O(n)。
特别是对于红黑树,节点着色只是一种记账技巧,有助于证明旋转始终保持h = O(lg n)。不同类型的平衡二叉树(AVL 树、2-3 树等)使用不同的记账技术来维护相同的属性。
【讨论】: