AVL 树的定义

AVL 树是一种自平衡的二叉搜索树,它满足如下性质:


AVL 树的插入

当向 AVL 树中插入关键字时,AVL 树会新增一个叶子节点,因此可能导致某些节点失衡,AVL 树通过旋转失衡点,使二叉树重新保持平衡。

向 AVL 树中插入节点的逻辑是:从插入点开始,向上寻找失衡点,如果没有节点失衡,则插入结束;否则,围绕第一个失衡点进行旋转,因为在旋转前后,子树的高度不变,所以无需再向上回溯。

关于 AVL 树的旋转请参考:AVL 树的旋转

简而言之:

下面是判断属于何种旋转类型的方法:

下面是寻找第一个失衡点的方法:

从插入点的父节点开始,朝着根节点方向前进,依次调整所经过的节点的平衡因子:


AVL 树的删除

二叉搜索树删除节点的本质是:使用待删除节点的左子树的最右节点(或右子树的最左节点)的关键字替换待删除节点的关键字,然后再将左子树的最右节点(或右子树的最左节点)删掉。

在 AVL 树中,删除节点时,如果导致某些节点失衡,那么需要进行旋转。因为旋转之后,子树的高度可能比删除节点之前的高度小 1,所以在旋转后,可能需要继续向根节点方向回溯。

下面是,删除节点时,导致失衡的四种情形:


Python 实现

tim-chow 的 Github