AVL平衡树插入删除结点过程平衡操作图示

笑着哭i 提交于 2019-11-29 21:12:29

AVL插入结点

通过这张图来描述AVL平衡树在插入新结点过程中,通过旋转操作来达到自平衡的四种场景:

  1. LL单旋转:新结点插入在A的左孩子(L)的左子树(L),这种场景在插入新结点后,同一路径上的A和B的平衡因子符号相同(2,1),只需要一次右旋操作即可重新达到平衡。
  2. LR双旋转:新结点插入在A的左孩子(L)的右子树(R),这种场景在插入新结点后,同一路径上的A和B的平衡因子符号不同(2,-1),先对以B为根的二叉树左旋一次,再对以A为根的二叉树右旋一次即可重新达到平衡。
  3. RL双旋转:新结点插入在A的右孩子(R)的左子树(L),这种场景在插入新结点后,同一路径上的A和B的平衡因子符号不同(-2,1),先对以B为根的二叉树左旋一次,再对以A为根的二叉树右旋一次即可重新达到平衡。
  4. RR单旋转:新结点插入在A的右孩子(R)的右子树(R),这种场景在插入新结点后,同一路径上的A和B的平衡因子符号相同(-2,-1),对以A为根的二叉树右旋一次即可重新达到平衡。

所以,实际上只有左旋和右旋两种最基本的操作,只是每次旋转的二叉树不一样。对一棵二叉树进行旋转,实际上就是让其根结点的左孩子(右旋)或者右孩子(左旋)来代替原根结点的位置,并保证整棵树中序遍历的顺序不变。

注解:

  1. 其中的A结点是插入新结点的祖先,在插入新结点前,以这个结点为根结点的二叉树的平衡因子一定是1或者-1。
  2. 不平衡树中的平衡因子的值限于-2,-1,0,1和2。
  3. 从根到新插入结点的路径上,只有经过的结点的平衡因子才会在插入后改变。
  4. 图中A/B/C这样的代表单个结点,带下标的结点都代表一颗子树。

AVL删除结点

删除AVL平衡树结点后的平衡处理和插入类似,不过有下面6种场景,删除结点在A的右子树为R型不平衡,删除结点在左子树为L型不平衡。对于这些场景,同样是围绕着对删除前平衡因子为-1或者1,删除后平衡因子为-2或者2的子树进行讨论:

  1. R0单旋转:删除的是A右子树的结点,删除后A的平衡因子为2,并且其左子树的平衡因子为0,一次右旋操作即可重新达到平衡。
  2. R1单旋转:删除的是A右子树的结点,删除后A的平衡因子为2,并且其左子树的平衡因子为1,一次右旋操作即可重新达到平衡。
  3. R-1双旋转:删除的是A右子树的结点,删除后A的平衡因子为2,并且其左子树的平衡因子为-1,因为删除后A和B的平衡因子符号不同,所以需要两次旋转才能重新达到平衡。
  4. L0单旋转:删除的是A左子树的结点,删除后A的平衡因子为-2,并且其右子树的平衡因子为0,一次左旋操作即可重新达到平衡。
  5. L-1单旋转:删除的是A左子树的结点,删除后A的平衡因子为-2,并且其右子树的平衡因子为1,一次左旋操作即可重新达到平衡。
  6. L1双旋转:删除的是A左子树的结点,删除后A的平衡因子为-2,并且其右子树的平衡因子为-1,因为删除后A和B的平衡因子符号不同,所以需要两次旋转才能重新达到平衡。

下面的图描述了对R型不平衡的处理:

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!