所以我在自学 AVL 树,我理解它背后的基本思想,但我只是想确保我实际实现它的直觉是有效的:
我会用左旋转检查它-
所以,下面的情况很简单:
8
/ \
7 10
/
6
/
3
当我们添加 3 时,树将自身重新平衡为:
8
/ \
6 10
/ \
3 7
但是旋转是基于 3 的加法还是基于 7 的子树的不平衡?甚至是基于以 8 为根的树的不平衡性吗?
在我看来,下面的例子有点麻烦:
9
/ \
7 10
/ \
6 8
/
3
因此,在这种情况下,添加 3 时,7 处的子树就可以了,因此子树不需要旋转。但是,在 9 处的树在加上 3 时是不平衡的,因此我们将旋转基于 9。我们得到:
7
/ \
6 9
/ / \
3 8 10
因此,在编写我的代码时,我很快就会写下下面的代码,从小子树开始到更大的子树,是否可以解决问题?
伪代码:
function balanceTree(Node n){
if (n is not null){
balanceTree(n.rightchild);
balanceTree(n.leftchild);
}
if (abs(balanceFactor(n))>1){
rotateAsNeeded(n);// rotate based on balance factor
}
}
提前致谢!