AVL树
- 带有平衡条件的二叉查找树——每个节点的左子树和右子树的高度最多差1的二叉查找树。
- 空树的高度定义为-1。
- 当插入节点时,有可能破坏AVL树的平衡性,分为以下几种情形:
- 对a的左儿子的左子树进行一次插入(左左/LL)
- 对a的右儿子的右子树进行一次插入(右右/RR)
- 对a的左儿子的右子树进行一次插入(左右/LR)
- 对a的右儿子的左子树进行一次插入(右左/RL)
- 对于以上四种情形,可分为两类,前两者通过单旋转解决,后两种通过双旋转解决。
单旋转:
可以看出节点8成为了插入后被破坏平衡的点,则在该点与其子节点间做一次单旋转(-8–9-),图示为对RR情况进行的逆时针旋转。
单旋转将被破坏平衡的点降下一单位高度,其子树提升至其原来的位置。
值得一提的是,如果节点9拥有左子树(8< x <9)需要将该树(x)添加到8节点的右子树上以保持整个树仍为二叉查找树。
双旋转:
- 易知当插入节点14后,被破坏平衡的节点为6,插入方式为右左:
- 先将右儿子向右转。
- 再将根向左转。
- 双旋转先解决被插入的儿子,再解决根节点。
- 在进行旋转时,同样要遵守“过继”的原则,就是把被提升节点的对应子树赋给其新子树的对应位置。(emmmm,不是很好形容,但是我觉得“过继”这个词很传神。)