平衡二叉树之AVL树的旋转

平衡二叉树是基于二叉排序树(或者也叫二叉搜索树)实现的一种自平衡的二叉树,实现方法有比如:AVL树、红黑树等等

二叉搜索树定义(维基百科):

二叉查找树(英语:Binary Search Tree),也称二叉搜索树、有序二叉树(英语:ordered binary tree),排序二叉树(英语:sorted binary tree),是指一棵空树或者具有下列性质的二叉树:

1.若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
2.若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
3.任意节点的左、右子树也分别为二叉查找树;
4.没有键值相等的节点。

二叉查找树相比于其他数据结构的优势在于查找、插入的时间复杂度较低。为O(log n)

平衡二叉树定义(维基百科):

平衡二叉搜索树(Balanced Binary Tree)是一种结构平衡的二叉搜索树,即叶节点深度差不超过1,它能在O(log n)内完成插入、查找和删除操作,最早被发明的平衡二叉搜索树为AVL树。

二叉查找树插入的时候很快,但是它可能会退化为线性链表,所以查询的时候有可能时间复杂度为O(n)

如图:

《平衡二叉树之AVL树的旋转》

但是平衡二叉树插入的时候会自动平衡让它任何节点的左右子节点的高度差不超过1,主要是通过树的旋转来解决。

以AVL树来做一个说明,其中数的旋转有两种:一种是左旋,一种是右旋。
有的时候通过一次旋转就能维持平衡,而有的时候需要两次。主要有四种情况,左左、左右、右左,右右,其中左左和右右是只需要一次旋转,而左右和右左需要两次旋转,具体如下:

《平衡二叉树之AVL树的旋转》

1-1左左模式和1-4右右模式只需要旋转一次,其中旋转的方式是一样的,而旋转方向不同而已,下面就拿一个左左的方式:

《平衡二叉树之AVL树的旋转》

根节点的左边的深度为减去右边的深度差值为2,说明并不满足平衡二叉树,所以需要进行旋转,根据分析是左边深度大于右边,并且超出的节点2的父节点于祖父节点的左边,所以是左左模式,及需要进行右旋,右旋的时候将节点3作为根节点,节点5像右边作为节点3的右子节点,并且将节点4断开和节点3的连接然后再作为节点5的左子节点,旋转完成(其中右右模式同理,左旋就行了,旋转是一样的只是方向不一样而已)。

1-2左右和1-3右左都需要旋转两次,方向不一样而已操作一样,就拿1-2左右来说,如下图所示:

《平衡二叉树之AVL树的旋转》

第一次旋转:将二叉树的1、2、3、4节点抽出来进行左旋,得到后面的树然后再结合5、6节点变成最后一个二叉树,第一次旋转得到的二叉树是一个左左模式。

然后根据左左模式进行右旋,即可得到平衡二叉树:

《平衡二叉树之AVL树的旋转》

第二次旋转:然后将这个第一次旋转的左左模式二叉树安装图1-1进行右旋即可,最终得到一个AVL树。

    原文作者:平衡二叉树
    原文地址: https://blog.csdn.net/qq_20641565/article/details/79272257
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞