AVL 树是一种自平衡的二叉搜索树,它满足如下性质:
当向 AVL 树中插入关键字时,AVL 树会新增一个叶子节点,因此可能导致某些节点失衡,AVL 树通过旋转失衡点,使二叉树重新保持平衡。
向 AVL 树中插入节点的逻辑是:从插入点开始,向上寻找失衡点,如果没有节点失衡,则插入结束;否则,围绕第一个失衡点进行旋转,因为在旋转前后,子树的高度不变,所以无需再向上回溯。
关于 AVL 树的旋转请参考:AVL 树的旋转。
简而言之:
下面是判断属于何种旋转类型的方法:
下面是寻找第一个失衡点的方法:
从插入点的父节点开始,朝着根节点方向前进,依次调整所经过的节点的平衡因子:
二叉搜索树删除节点的本质是:使用待删除节点的左子树的最右节点(或右子树的最左节点)的关键字替换待删除节点的关键字,然后再将左子树的最右节点(或右子树的最左节点)删掉。
在 AVL 树中,删除节点时,如果导致某些节点失衡,那么需要进行旋转。因为旋转之后,子树的高度可能比删除节点之前的高度小 1,所以在旋转后,可能需要继续向根节点方向回溯。
下面是,删除节点时,导致失衡的四种情形: