平衡树是一种特殊的二叉树,引入了平衡因子概念,对于每一个节点,统计左子树与右子树的高度,两者的差即为平衡因子,平衡因子为-1,1,0时我们认为树是平衡的,当出现2,-2时则认为树失衡了,需要进行调整。同时由于一颗子树的失衡会向根节点传递,所以我们只需要将第一个失衡子树平衡,就能保持整体的平衡。
平衡树出现失衡的情况只有两种,增加节点时与删除节点时。以下分开讨论。
1.增加节点
由于增加节点导致的失衡,一定是因为某一个节点新增加了一个右子树或左子树。而平衡方法就是寻找到合适的继承人节点,让它成为新的子树根节点,并对子树结构进行微调。继承人节点的操作有点类似二叉树删除操作,只不过被替代的节点没有删除而是成为了新根节点的子节点。
由于我们每插入一个新节点就检查平衡因子,因此当发现失衡时,失衡节点的平衡因子一定是2或-2,只要将一个新的节点代替失衡节点,将失衡节点降级为新节点的子树,那么平衡树就重新平衡了。
以下将”离新增节点最近的失衡节点“简称为失衡节点,选择算法为:若新增节点处于失衡节点的左子树,则将左子树中值最大的节点作为新的根节点代替失衡节点,失衡节点以及右子树作为新根的右子树;
若新增节点处于失衡节点的右子树,则将右子树中最小的节点作为新根,失衡节点以及左子树作为新根的左子树。
这样,每次平衡所需要的操作就是
1.寻找失衡节点,
2.根据平衡因子的正负判断新增节点位置,
3.根据上一步的判断挑选继承节点(左大右小),
4.删除原来的继承节点,将失衡节点与半边子树组成的失衡子树从原平衡树上剥离,将继承节点放到原失衡节点的位置,并与两颗子树相连。
2.删除节点
一开始的删除操作与普通二叉树一样,删除之后更新各个节点的平衡因子,发现第一个失衡节点后进行平衡,操作与增加节点一致。