平衡二叉树(AVL Tree)(左旋、右旋)

AVL Trees (Balanced binary search trees)

平衡二叉树的定义:左右子树深度差绝对值不能超过1。

是什么意思呢?比如左子树的深度是2,右子树的深度只能是1 或者3。

这个时候我们再按顺序插入1、2、3、4、5、6,一定是这样,不会变成一棵“斜树”。

那它的平衡是怎么做到的呢?怎么保证左右子树的深度差不能超过1 呢?

https://www.cs.usfca.edu/~galles/visualization/AVLtree.html

插入1、2、3。

我们注意看:当我们插入了1、2 之后,如果按照二叉查找树的定义,3 肯定是要在2 的右边的,这个时候根节点1 的右节点深度会变成2,但是左节点的深度是0,因为它没有子节点,所以就会违反平衡二叉树的定义。

那应该怎么办呢?因为它是右节点下面接一个右节点,右-右型,所以这个时候我们要把2 提上去,这个操作叫做左旋。

同样的,如果我们插入7、6、5,这个时候会变成左左型,就会发生右旋操作,把6提上去。

所以为了保持平衡,AVL 树在插入和更新数据的时候执行了一系列的计算和调整的操作。

平衡的问题我们解决了,那么平衡二叉树作为索引怎么查询数据?

在平衡二叉树中,一个节点,它的大小是一个固定的单位,作为索引应该存储什么内容?

它应该存储三块的内容:

第一个是索引的键值。比如我们在id 上面创建了一个索引,我在用where id =1 的条件查询的时候就会找到索引里面的id 的这个键值。

第二个是数据的磁盘地址,因为索引的作用就是去查找数据的存放的地址。

第三个,因为是二叉树,它必须还要有左子节点和右子节点的引用,这样我们才能找到下一个节点。比如大于26 的时候,走右边,到下一个树的节点,继续判断。

如果是这样存储数据的话,我们来看一下会有什么问题。

在分析用AVL 树存储索引数据之前,我们先来学习一下InnoDB 的逻辑存储结构。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值