平衡二叉树AVL详解

一、平衡二叉树的定义

平衡二叉树(Balanced Binary Tree)又被称为AVL树,它且具有以下性质:

(1)它是一棵空树或它的左右两个子树的高度差的绝对值不超过1;

(2)并且左右两个子树都是一棵平衡二叉树。

把二叉树的每个节点的左子树减去右子树定义为该节点的平衡因子。二叉平衡树的平衡因子只能是1、0或者-1。


需要注意的是,平衡二叉树是对二叉搜索树(又称为二叉排序树)的一种改进。二叉搜索树有一个缺点就是,树的结构是无法预料的,随意性很大,它只与节点的值和插入的顺序有关系,往往得到的是一个不平衡的二叉树。在最坏的情况下,可能得到的是一个退化(单支)二叉树,其高度和节点数相同,相当于一个单链表,对其进行查找的时间复杂度由O(logn)变成了O(n),从而丧失了二叉排序树的一些应该有的优点。


二、平衡二叉树AVL调整

在平衡二叉树中删除或插入节点后,可能会使某些节点的平衡因子的绝对值大于 ,即树失去了平衡,这时候就需要进行平衡调整,使其重新满足平衡二叉树的要求。

调整平衡二叉树之前,首先要明白一个定义:最小不平衡子树。最小不平衡子树是指以离插入节点最近、且平衡因子绝对值大于1的节点做根的子树。


平衡二叉树的调整主要分为四种:

(1)单向右旋平衡处理LL:由于在*a的左子树根节点的左子树上插入节点,*a的平衡因子由1增至2,致使以*a为根的子树失去平衡,则需进行一次右旋转操作;

如下图所示:发生不平衡(平衡因子绝对值大于1)的节点和插入的节点在一条直线上,如同  /  则只需要进行一次向右旋转即可。旋转之后,不平衡节点的左孩子的右子树,需要移动到不平衡节点的左子树上。

(2)单向左旋平衡处理RR:由于在*a的右子树根节点的右子树上插入节点,*a的平衡因子由-1变为-2,致使以*a为根的子树失去平衡,则需进行一次左旋转操作;

如下图所示:发生不平衡(平衡因子绝对值大于1)的节点和插入的节点在一条直线上,如同  则只需要进行一次向左旋转即可。旋转之后,不平衡节点的右孩子的左子树,需要移动到不平衡节点的右子树上。

(3)双向旋转(先左后右)平衡处理LR:由于在*a的左子树根节点的右子树上插入节点,*a的平衡因子由1增至2,致使以*a为根的子树失去平衡,则需进行两次旋转(先左旋后右旋)操作。

如下图所示:发生不平衡(平衡因子绝对值大于1)的节点和插入的节点不在一条直线上,如同  < 则首先需要进行一次向左旋转,然后进行一次向右旋转。

(4)双向旋转(先右后左)平衡处理RL:由于在*a的右子树根节点的左子树上插入节点,*a的平衡因子由-1变为-2,致使以*a为根的子树失去平衡,则需进行两次旋转(先右旋后左旋)操作。

如下图所示:发生不平衡(平衡因子绝对值大于1)的节点和插入的节点不在一条直线上,如同  > 则首先需要进行一次向右旋转,然后进行一次向左旋转。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值