平衡二叉树(AVL树)原理

2023-12-28 14:12:14

1、平衡二叉树(AVL树)

平衡二叉树也称之为AVL树,是一个具有以下特征的二叉搜索树:

1、左子树和右子树高度差不会大于1

2、左右两颗子树都满足第一个条件。

1.1、满足条件的AVL树

以下树,左边的高度为3,右边的高度为2,高度差为1,满足条件。

1.2、不满足条件的AVL树

以下树,左边的高度为4,右边的高度为2,高度差大于1,不满足条件。

1.3、为什么需要平衡二叉树

平衡二叉树是为了提高二叉树的查询速度。如果没有平衡二叉树,当我们给有序数据排序时,会产生一颗斜树,斜树是单链结构,失去查询速度快的优势。下面生成一颗斜树。

从图中可以看出,左斜树或者右斜树像是一个链表,插入和删除的速度依旧较快,但是查询的速度较慢,因为遍历深度更深,需要消耗更多的磁盘I/O操作。这个时候我们可以对其进行改造。

1.4、改造之后的二叉树

这个时候我们可以看出,平衡二叉树有了左子树和右子树,树的高度发生了变化,查询时候的磁盘I/O开销更小,速度更快。

1.5、平衡二叉树需要进行左旋转操作和右旋转操作

平衡二叉树需要满足:左子树和右子树高度差不会大于1,如果大于1这个时候需要进行左旋转或右旋转。如下图二叉树就需要进行左旋转操作。

2、平衡二叉树左旋转或右旋转规则

右旋转相反,不做过多的阐述。

2.1、平衡二叉树左旋转

2.1.1、左旋转过程

1、获取当前二叉树的根节点,作为新节点并创建节点

2、获取当前二叉树的左子树,作为新节点的的左子树。

3、获取当前二叉树根节点的右子树的左节点,作为新节点的右子树。

4、获取当前二叉树右节点的值,作为新树的根节点。

5、获取当前二叉树右节点的右子树,作为新二叉树的右子树

3、平衡二叉树需要双旋转的情况

案例中为了跟上面的案例达到一脉相承的效果,写了一个4.1,比较突兀,就是为了满足条件,大家可以使用权限的数字替代也行。

3.1、双旋转过程

双旋转是基于单旋转(左旋、右旋),其只是对单旋转的代码调用,通过代码来理解双旋转即可。

双旋转代码的核心思想在于:在创建二叉树的过程中,每次添加新的节点,都要判断一下该二叉树是否需要旋转。

如果二叉树需要左旋,则先判断根节点的右子节点的左子树高度是否大于右子树的高度,如果大于则先对根节点的右子树进行右旋,最后再对原二叉树进行左旋;

如果二叉树需要右旋,则先判断根节点的左子节点的右子树高度是否大于左子树的高度,如果大于则先对根节点的左子树进行左旋,最后再对原二叉树进行右旋。

3.2、解决上述问题

我们可以在对原二叉树右旋之前,将其右子树(以 6 为根节点的树)进行一次右旋即可。

然后再对整颗树进行左旋转

文章来源:https://blog.csdn.net/tangshiyilang/article/details/135266424
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。