对于红黑树,任何不平衡都会在三次旋转内解决?
老师,我看在这篇文章中说了“对了红黑树,任何不平衡都会在三次旋转内解决”我不能够理解这句话。
假设一个高度为10的红黑树,我在最后一层添加一个元素至3-节点中,然后一路往上直到根节点都是3-节点,也就是树高加1的情况,而每次往上插入的时候都碰巧插入到3-节点的中链接或者是左链接,也就是每次插入都至少需要一次旋转操作,这样下来不是肯定会超过三次旋转吗?
关于我们课程中的左倾红黑树可能确实没有“任何不平衡都会在三次旋转内解决”这样的性能优势。我在网上也有了解过与2-3-4树对应的红黑树,与上述的情况相同,如果我在第10层的位置插入一个元素到一个4-节点中,再一路往上直到根节点都是4-节点,那么旋转的次数也是会超过三次的。
老师,请问“对于红黑树,任何不平衡都会在三次旋转内解决”这句话应该怎么理解
正在回答
因为这个课程没有实现一个非“左倾红黑树”,所以我只能相对“感性”地来阐述这个问题。而实际上,如果 case by case 的解释清楚这个问题,也会比较复杂,因为一棵镇针对各红黑树(非左倾红黑树),田家河删除需要考虑的情况达 6 种之多(而非左倾红黑树的 3 种。)
简单来说,你说的情况不存在。如果添加了一个节点,在 10 层的高度,每次往上走都需要通过旋转才能调整平衡,那么这棵树肯定最初就不会是平衡的。(不满足红黑树定义的平衡。)
这里的另一个关键在于,对于一个真正的红黑树(非左倾红黑树)来说,红节点是可以右倾的。也就是一个黑节点,可以左右两个节点都是红节点。一个核心在于,真正的红黑树,红节点是可以在右倾的。这使得每添加一个红色节点,这个红色节点不一定往上传。
比如:
15B / \ 10(R) 17B / \ 7(B) 12(B) / 3(R)
如果添加一个 1
15(B) / \ 10(R) 17(B) / \ 7(B) 12(B) / 3(R) / 1(R)
对于左倾红黑树,在 7 左旋转:
15(B) / \ 10(R) 17(B) / \ 3(B) 12(B) / \ 1(R) 7(R)
此时,在 3 要做 flip colors:
15(B) / \ 10(R) 17(B) / \ 3(R) 12(B) / \ 1(B) 7(B)
之后,10R 和 3R 又是两个连续的红节点,于是又要旋转。
但是对于没有做请要求的红黑树,在 flip colors 之前的这棵树:
15(B) / \ 10(R) 17(B) / \ 3(B) 12(B) / \ 1(R) 7(R)
他已经满足红黑树的定义了(最关键的是黑平衡),所以,已经不需要后续的操作了,也就不需要继续旋转了。
随便举了一个例子,说明如果没有“左倾”这个条件,其实维护红黑树的性质,需要的旋转更少了。但因为可以右倾,所以,分类讨论的情况变多了,变复杂了。
继续加油!:)
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星