对于平衡树为了保持它的特性,我们经常会做旋转操作(左旋,右旋,左右双旋,右左双旋)。这个本来是一个很基础的东西,一直也没放在心上,但经常一说起来却忘了具体是怎么操作的,于是写下一点理解帮助记忆。(欢迎讨论,尤其是理解有误的欢迎指正。)
自下向上地,在节点平衡因子(假设为 A 吧) |A| >= 2 (一般就等于2了)时就需要旋转,把这节点及以下看成独立的树也就可以将这节点看作根节点。A>0时向右找,A<0时向左找,遇到的下一个节点A‘(很明显|A‘|<=1)
- 与A同号时则需要单旋,就选它做根节点。原根节点X将作为一个子树,然后将原来A'这边的子树(树1吧)接到X上,将另一边子树(树2吧)留着继续作为A’的子树。因为它是处在高度(假设为H)高的那一边(比另一边至少高2,也就是另一边最多为H-2),向上移动使得这一段高度减一为H-1,另一边加1从而最多为H-1,又|A'|=1,所以另一边至少也为H-1,即就为H-1,,则移动后平衡因子变为0;
- 与A异号时则需要双旋,继续根据符号左右走,遇到的第一个平衡因子为0的节点作为根节点。原根节点X将作为一个子树,然后将原来A'这边的子树(树1吧)接到X上,将另一边子树(树2吧)接到父节点上代替原来A'的位置。
- 等于0的话需要双旋(类似2),当然就是它本身作为根节点了。原根节点X将作为一个子树,然后将原来A'这边的子树(树1吧)接到X上,将另一边子树(树2吧)留着继续作为A’的子树。