数据结构 平衡二叉树 (AVL Tree)

2,570 阅读2分钟

定义

平衡二叉树(AVL树)在符合二叉查找树的条件下,还满足任何节点的两个子树的高度最大差为1。

如图,左图两边高度差没超过1,属于平衡二叉树(AVL树),右图两边高度差超过1,属于非平衡二叉树

平衡二叉树的失衡

如果在AVL树中进行插入或删除节点,可能导致AVL树失去平衡。

从上面可以看出,失衡原因是左右子树高度差到达了2

四种失衡情况

二叉树的失衡分为四种情况

LL(左左)失衡

左树的左侧比右树高了两层,因此是 左树的左侧 导致的失衡,所以叫左左

LR(左右)失衡

左树的右侧 导致的失衡

RL(右左)失衡

右树的左侧 导致的失衡

RR(右右)失衡

右树的右侧 导致的失衡

失衡调整

失衡之后,需要将AVL Tree调整为平衡状态,不同的失衡情况调整方法也不一样

LL(左左)失衡调整

如下图 将LL(左左)失衡的树型结构想象成用线链接的小球

  1. 用手将左树的头节点的小球提起来,一直提到比原始头节点还高的位置。此时,原始头节点"掉了下来",左树头节点成为新的头节点。
  2. 新的头节点有三个子节点,其中中间的那个节点是原来左树的右节点,把它的线解开,然后把它挂载到原始头节点的左侧
  3. 经过这两个步骤,LL(左左)失衡的AVL Tree调整平衡

失衡调整核心步骤总结:

  1. “提起”失衡子树,直到原始头节点“落下”,失衡子树的头节点成为新的头节点
  2. 将新头节点的中间节点(原始子树右节点),挂载到原始头节点的左侧

RR(右右)失衡调整

RR(右右)失衡调整 跟 LL(左左)失衡调整是同一个套路,我就不画那么详细了

如图,两种RR(右右)失衡调整 情况二

LR(左右)失衡调整

RL(右左)失衡调整

与 LR(左右)失衡调整相同的套路,先将RL(右左)失衡变成 RR(右右)失衡,然后在按 RR(右右)失衡的策略调整,具体我就不画了,感兴趣的同学可以动手画一下

平衡二叉树存在的问题

平衡二叉树 (AVL Tree) 每个节点下最多只有两个节点,当数据量变大了之后,树的高度就会增加,导致查询效率下降。

为了解决这个问题,人们又发明了平衡多路查找树 (B-Tree)