数据结构与算法(C语言) | AVL树

AVL树,是一种平衡(balanced)的二叉搜索树。

 

二叉平衡树是二叉查找树(二叉排序树)的另一种形式,其特点为:树中每个结点的左、右子树深度之差的绝对值不大于1 。

\left | h_{L}-h_{R} \right |\leqslant 1

数据结构与算法(C语言) | AVL树_第1张图片

关于AVL树的操作,大部分都能复用平衡二叉树树的操作,但是对于插入和删除操作来说,很可能由于节点的插入和删除导致AVL树的平衡状态就被破坏,所以我们需要一种机制来检测这棵树是否平衡,以及当它不平衡的时候,我们应该通过某些操作使它重新平衡(rebalanced)。

 

 结点的平衡因子—— 结点的左子树深度与右子树深度的差。

AVL树中每个结点的平衡因子只能是 -1, 0, 1

AVL树的存储表示中,每个结点不仅要存储关键字和左、右孩子指针等,而且要存储结点的平衡因子。

AVL树的插入或删除过程中,需根据相关平衡因子的变化情况,对树的结构进行调整,以使之保持平衡。

数据结构与算法(C语言) | AVL树_第2张图片

 

 旋转

如果在AVL树中进行插入一个新的节点或删除某个节点后,可能导致AVL树失去平衡。这种失去平衡的可以概括为4种姿态:LL(左左),LR(左右),RR(右右)和RL(右左)。

数据结构与算法(C语言) | AVL树_第3张图片

 上图中的4棵树都是"失去平衡的AVL树"。除了上面的情况之外,还有其它的失去平衡的AVL树

数据结构与算法(C语言) | AVL树_第4张图片

AVL树失去平衡时的情况一定是LL、LR、RL、RR这4种之一

LL:称为"左左"。插入或删除一个节点后,根节点的左子树的左子树还有非空子节点,导致"根的左子树的高度"比"根的右子树的高度"大2,导致AVL树失去了平衡。

LR:称为"左右"。插入或删除一个节点后,根节点的左子树的右子树还有非空子节点,导致"根的左子树的高度"比"根的右子树的高度"大2,导致AVL树失去了平衡。

RL:称为"右左"。插入或删除一个节点后,根节点的右子树的左子树还有非空子节点,导致"根的右子树的高度"比"根的左子树的高度"大2,导致AVL树失去了平衡。

RR:称为"右右"。插入或删除一个节点后,根节点的右子树的右子树还有非空子节点,导致"根的右子树的高度"比"根的左子树的高度"大2,导致AVL树失去了平衡。

你可能感兴趣的:(数据结构与算法(C语言))