My Little World

平衡二叉排序树

特征

首先得是一颗二叉排序树
左子树与右子树都是平衡二叉树
每个结点左子树与右子树的深度差的绝对值不能大于1
结点左子树深度减右子树深度的差叫做平衡因子BF,即|BF|<=1,BF=-1/1/0
平衡二叉树就是一颗二叉树上所有结点的平衡因子的绝对值小于等于1 的树

关键操作

左子树bf大于右子树bf,右旋
左子树bf小于右子树bf,左旋
左旋的子树的右子树若存在左子树,将该左子树做左旋子树根结点的右子树,左旋子树根结点做其右子树的左子树
右旋的子树的左子树若存在右子树,将该右子树做右旋子树根结点的左结点,右旋子树根结点做其左子树的右子树

构建

现用以下数据构建平衡二叉树
3,2,1,4,5,6,7,10,9,8
balance
按照大于父节点做右子树小于父结点做左子树原则,将3,2,1构建树,当1进入树之后3的左子树深度2减右子树深度0大于1,以2为中心进行右旋,如图1
继续添加4和5,当5进入树之后,3的左右子树深度差为-2,断开2,3链接,将3,4,5,以4为中心左旋,再与2相连,如图2
继续添加6,当6进入树之后,这时2的bf为-2,以2的右子树根结点为中心左旋,此时1,2和3均为4的左子树,则将4的原左子树做新左子树的右子树,如图3
添加7,当7进入树之后,5的bf为-2,断开4,5链接,以6为中心左旋,再与4相连,如图4
添加10、9,当9进入树之后,6的bf为-2,断开6、7,因为10有左结点,先将9、10关系转换,让10做9孩子结点,然后以9为中心左旋,再与6相连,如图5
添加8,4、6的bf又变为-2,断开4、6,9的bf为1,因为将来要对6左旋,所以先将9右旋,使9的bf变成0或负值,再对6以7为中心左旋,如图6
最终结果如图7
代码链接