本文详细讲解AVL平衡二叉树算法。
废话少说,我们知道有四种情况需要平衡,其实每一种情况还有一些需要考虑的细节。这就是为什么我上篇中有疑问的原因,不知道的同学可以参考上一篇。
下面我将根据代码扩展讲解四种情况,这样大家就能明白为什么LeftBalance中会需要判断rd->bf了。
第一种情况,如图1.1:
图 1.1 图 1.2
这种情况最简单,只需通过一次左旋就搞定了,结果如图1.2。
下面注意了,第一种情况还有扩展哦,上次我就在这吃了亏,哈哈。
如图1.3和1.4
图 1.3 图1.4
都是在A的右子树的右子树上插入节点。
上面三种情况对应RightBalance函数中case RH分支,只需进行一次左旋即可。
图1.3旋转结果 图1.4旋转 结果
第二种情况,如图1.5
图1.5
知道R啥意思吧?
第二种情况扩展,总共有两种,如图1.6和1.7:
扩展1
图1.6
扩展2
图1.7
其实大家可以发现扩展1和扩展2就是在C的左孩子和右孩子之间徘徊。
第二种情况对应RightBalance函数中case LH分支,需进行两次旋转,先右旋再左旋。
到这终于就解释了我上一篇我提的疑问,为什么case LH中还需判断rd->bf呢?观察第二
种情况及其扩展我们就显而易见了。
下面介绍第三种情况,第三种情况和第一种对应,如图1.8。
图1.8
对应第一种情况只需进行一次右旋。
对应LeftBalance函数中的case LH分支语句。
同理,当然也有两个扩展啦!如图1.9和2.0
图 1.9
图 2.0
哎,终于到第四种情况了,虽然道理简单,打出来却不容易啊。
第四种情况和第二种情况对应,要进行两次旋转,如图2.1.
先左旋再右旋。
2个扩展如图2.1和2.2
图2.1
下面就是改变了D的位置。
图2.2
第四种情况对应LeftBalance函数总case RH分支语句,同样通过第四种情况以及扩展可以很好的了解为什么会要判断rd->bf平衡因子了。
看完了四种情况,我想大家也应该对平衡二叉树的情况有了更加深入的了解了吧。
当然上面的四种情况是我在分析上一篇上传的代码总结出的,代码不同,具体考虑的就不一样了,仅供参考。