AVL Tree与BST
由于AVL树本身就是一颗自平衡的BST,因此其的删除比起BST仅仅多了删除后平衡的调整
查找:
AVL树中一定不存在两个值大小相同的节点
从AVL树根开始向下搜索,根据意图删除值与当前节点值大小关系进行下一步操作:
1、 当前节点值大于意图删除值,保存当前节点并在当前节点的左子树中继续查找意图删除值
2、 当前节点值小于意图删除值,保存当前节点并在当前节点的右子树中继续查找意图删除值
3、 当前节点值等于意图删除值,准备进行删除
查找的过程中保存当前节点,是为了便于回溯并修改、判断可能被删除影响的节点的平衡因子
删除:
根据意图删除节点的子树个数可以将删除分为三种情况:
1、 意图删除的节点没有子树(叶子节点)
2、 意图删除的节点有且仅有一个子树
3、 意图删除的节点既有左子树又有右子树
与BST的删除相同,这三种情况又可以概括为两种情况:
1、 意图删除节点最多存在一个子树
2、 意图删除节点存在两个子树
情况1的删除非常简单,就不解释了,情况2下需要将删除有两个子树的节点转换为删除仅有一个子树的节点:
使用意图删除节点的最大左子树值或者最小右子树值替换意图删除值,再删除替换值所在节点
删除完成后立即根据之前查找时保存的节点信息回溯(修改平衡因子并立即判断平衡因子)
调整平衡:
AVL树是否平衡是由平衡因子决定的,修改完平衡因子后应立即判断平衡因子,根据平衡因子的情况作下一步操作,回溯到的节点的平衡因子修改后立即判断平衡因子值:
1、 如果平衡因子为1 / -1则说明以其为根的树高度并没有改变,仅仅是其一个子树矮了,以其为子树