平衡二叉树(AVL树)原理

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 为根节点的树)进行一次右旋即可。

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

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雾林小妖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值