阅读 72

AVL平衡二叉树详解与实现

AVL平衡二叉树详解与实现

什么是平衡二叉树?

Adelson-Velsikii和Landis提出了一种结点在高度上相对平衡的二叉查找树,又称为AVL树。其平均和最坏情况下的查找时间都是O(logn)。同时,插入和删除的时间复杂性也会保持O(logn),且在插入和删除之后,在高度上仍然保持平衡。AVL树又称为平衡二叉树,即Balanced Binary Tree或者Height-Balanced Tree,它或者是一棵空二叉树,或者是具有如下性质的二叉查找树:其左子树和右子树都是高度平衡的二叉树,且左子树和右子树的高度之差的绝对值不超过1。如果将二叉树上结点的平衡因子BF(Balanced Factor)定义为该结点的左子树与右子树的高度之差,根据AVL树的定义,AVL树中的任意结点的平衡因子只可能是-1(右子树高于左子树)、0或者1(左子树高于右子树),在某些图中也会表示为绝对高度差,即0,1,2这种形式,请注意理解。

image.png

Rebalance:平衡调整

在平衡二叉树 插入或删除节点会导致不平衡,需要进行旋转操作使得树中每个节点都处于平衡状态

LL型:右旋转

当新插入节点为最近的非平衡子树的根节点的左孩子的左子树时,进行右旋转使其重新恢复平衡:

image.png 新插入的 节点A 导致 节点C 不平衡,且 结点A 位于结点C 的左孩子的左子树,因此 以 节点C 为轴进行右旋转

一个复杂的例子:

image.png

RR型:左旋转

当新插入节点为最近的非平衡子树的根节点的右孩子的右子树时,进行右旋转使其重新恢复平衡:

image.png

新插入的 节点C 导致 节点A 不平衡,且 结点C 位于结点A 的右孩子的右子树,因此 以 节点A 为轴进行右旋转

一个复杂的例子:

image.png

LR型:先右旋转再左旋转

当新插入节点为最近的非平衡子树的根节点的左孩子的右子树时,先进行左旋转再进行右旋转,使其重新恢复平衡:

image.png 新插入的 节点B 导致 节点A 不平衡,且 结点B 位于结点A 的左孩子的右子树:

①:以结点A为周进行右旋转

image.png

image.png 此时变成了LL型,再以结点C为轴进行右旋转

image.png

image.png 一个复杂的例子:

image.png RL型:先右旋转再左旋转

image.png

image.png

文章分类
代码人生
文章标签