AVL插入和卸下需要不断旋转

时间:2019-02-23 12:14:29

标签: binary-tree binary-search-tree avl-tree

我想证明标题中的声明,但我需要帮助。我的出发点是AVL树节点存储平衡因子,而不是存储以其为根的子树的高度:这应防止向上修改字段height


插入部分很容易。如果我们在AVL树中插入新节点,则第一个可能不平衡的祖先是祖父母。由于旋转子树的根不会改变子树本身的高度,因此,一旦执行了重新平衡祖父母所需的一到两次旋转,我们就不需要重新平衡其他祖先。 >


移除是造成困难的原因。我坚信它需要固定的旋转次数,因为我从未找到需要O(log(n))旋转来删除节点的AVL树。但是,这不能证明这样的AVL树不存在。

我们忽略了节点具有两个子节点的情况:我们将真正删除的节点将是其后继者或前任节点,它们都只有一个或零个子节点。

我们忽略了先前分析的树通过交换节点的左右子节点获得的树的情况:这不会更改树结构本身。

让我们假设我们删除一个节点,然后我们被迫旋转其父级和/或其祖父母级。旋转根不会改变其子树的高度:就像在插入操作中一样,在一轮旋转两次之后,祖父母的子树的根应该的平衡因子为零,并且其高度与去除。因此,没有祖先需要重新平衡。


如何在不创建所有AVL树并逐一检查的情况下使这种“证明”的不确定性降低?

0 个答案:

没有答案