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

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型不平衡的处理:

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值