今天学习了AVL树的实现,有2个地方想了很久才想明白。
问题1.为什么在父节点的平衡因子调整为零时结束递归地向父节点调整平衡因子?
即 if node.parent.balaceFactor != 0:
self.updateBalance(node.parent)
问题2.如何推导公式
rotRoot.balaceFactor=rotRoot.balaceFactor+1-min(newRoot.balaceFactor,0)
问题1的分析:
如图,要形成节点左倾(右倾用类似方法分析),新节点A只可能在2类位置存在:
情况1.新节点在B的左子树或右子树上
情况2.新节点在D的左子树或右子树上
情况1中,决定E的高度的是E的左侧树枝的深度(即节点C的左子树的高度),向右旋转后C的左子树的高度减1。
此时,若新根C的平衡因子为0,则新根C的右子树的高度=节点C的左子树的高度=新增之前E的高度,所以E的祖先节点的平衡因子没有变化,不需要继续向上调节平衡因子。
情况2 在调整平衡因子前属于LR的不平衡,需要转换为LL的不平衡再旋转,旋转之后的形态同情况1。
问题2:图书馆找到了推导: