二叉搜索树、二叉平衡树(AVL)以及图解左旋与右旋(超易理解版)

二叉搜索树

二叉搜索树(又叫二叉查找树、二叉排序树),具有以下特点:

  • 节点的左孩子的值小于节点本身;
  • 节点的右孩子的值大于节点本身;
  • 左右子树同样为二叉搜索树;

所以二叉搜索树最终的特性为:

  • 节点左子树的所有节点的值都小于节点本身;
  • 节点右子树的所有节点的值都大于节点本身;
  • 对二叉搜素树的一次中序遍历就是一个递增有序序列。
    在这里插入图片描述

二叉平衡树(AVL)

二叉平衡树是在二叉搜素树的基础上加上了限制:任意节点,左右子树的高度差不能超过1。这个约束常常借助左旋和右旋操作实现。

  • 二叉平衡树
    在这里插入图片描述
  • 不是二叉平衡树
    在这里插入图片描述

性质:

  • 它的左右子树都是AVL树

  • 左右子树高度之差的绝对值不超过1

  • 如果它有N个节点,其高度就可以保持在O(long2N),搜索的时间复杂度为O(long2N)。

平衡因子

平衡因子(bf):节点的右子树高度减去左子树高度。

结点的平衡因子 = 右子树的高度 - 左子树的高度

如果一棵二叉搜索树是高度平衡的(每个节点的平衡因子绝对值<=1),它就是 AVL 树。如果它有n个结点,其高度可保持在O(log2^n) ,
查找时间复杂度O(log2^n) 。

平衡二叉树的作用

二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。如下图所示:向一颗空的二叉查找树和AVL树中插入有序数列 {1,2,3,4,5,6}
在这里插入图片描述
由上图可知,在插入有序结点个数很多的情况下,会导致搜索二叉树的高度是O(N),查找时间复杂度O(n) ,
但是AVL树就不会出现这种情况,树的高度始终是O(log2 ^n) , 查找时间复杂度为O(log2 ^n) 。

平衡二叉树最大的作用就是查找,因为AVL树的查找、插入和删除在平均和最坏情况下都是O(logn)。但是如果在AVL树中插入或删除节点后,使得高度之差大于1。此时,AVL树的平衡状态就被破坏,它就不再是一棵二叉树;为了让它重新维持在一个平衡状态,就需要对其进行旋转处理。这时,就有左旋和右旋的概念。

左旋

对X节点左旋,即以X的右孩子Y为轴,将X节点转下来,变为Y的左孩子,简单记为左旋即把该节点变为左孩子。例如:
在这里插入图片描述

23被它的右子节点25取代,成为25的左子节点。如以下动图展示:

在这里插入图片描述
来源:左单旋

注意右孩子是必须存在的,即不能为空。

右旋

对X节点右旋,即以X的左孩子Y为轴,将X节点转下来,变为Y的右孩子,
简单记为右旋即把该节点变为右孩子。例如:
在这里插入图片描述
25被它的左子节点23取代,成为23的右子节点。如以下动图展示:
在这里插入图片描述
来源:右单旋

为什么要左旋右旋

在AVL平衡二叉树中,当插入或删除节点后,可能导致树的不平衡,需要进行旋转操作来恢复平衡。左旋和右旋是两种常见的旋转操作。

注意,通过左旋和右旋,我们并没有改变树的二叉搜索特性。以右旋为例,我们将25变成23的左节点,25>23,25的左子节点变为24,23<24<25。

  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值