深入理解AVL平衡二叉查询树

AVL树,是带有平衡条件(balance condition) 的二叉查询树。其平衡条件是每个节点的左子树和右子树的高度最多差1的二叉查询树(空树的高度定位-1)。树的高度是指,该树到一片叶子节点的最长路径的长。

当对AVL树进行插入,或者删除操作时,由于可能会破坏AVL树的平衡条件,为了能够在插入或删除操作完成后,继续保证AVL树的平衡,需要对AVL树进行旋转(retation)。通常就是包括单旋转双旋转两种情况。

单旋转

节点的左儿子节点,左子树添加新的节点的场景。示例,如图-1:

图-1

 在图-1中,在左边的AVL平衡二叉查询树中,添加节点[1]。如果节点[1],添加到节点[2]的左侧,此时,节点[3]于节点[5]的高度差为2,大于1,破坏了AVL平衡二叉查询树特性。并且,添加元素符合左儿子,左子树的情形,进行单旋转操作,在添加节点[1]后可以恢复AVL平衡二叉查询树特性,结果如图-1右侧的树。

节点的右儿子,右子树添加新的节点的场景,示例,如图-2:

图-2

 在图-2中,在左边的AVL平衡二叉查询树中,添加节点[7]。如果节点[7],添加到节点[6]的右侧,此时,节点[2]于节点[4]的高度差为2,大于1,破坏了AVL平衡二叉查询树特性。并且,添加元素符合右儿子,右子树的情形,进行单旋转操作,在添加节点[7]后可以恢复AVL平衡二叉查询树特性,结果如图-2右侧的树。

双旋转

节点的左儿子,右子树添加节点的场景,示例如图-3:

图-3

在图-3中,在左边的AVL平衡二叉查询树中,添加节点[4]。如果节点[4],添加到节点[5]的左儿子节点,此时,节点[3]与节点[8]的高度差为2大于1,破坏了特性AVL平衡二叉查询树特性。并且,添加元素符合儿子,右子树的情形,进行双旋转操作,在添加节点[7]后可以恢复AVL平衡二叉查询树特性,结果如图-3右边的树。

节点的右儿子,左子树添加节点的场景,示例如图-4:

图-4

在图-4中,在左边的AVL平衡二叉查询树中,添加节点[5]。如果节点[5],添加到节点[4]的右儿子节点,此时,节点[6]与节点[1]的高度差为2大于1,破坏了特性AVL平衡二叉查询树特性。并且,添加元素符合儿子,子子树的情形,进行双旋转操作,在添加节点[5]后可以恢复AVL平衡二叉查询树特性,结果如图-4右边的树。

发布了37 篇原创文章 · 获赞 2 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/new_com/article/details/104416692