002投影角度看二分搜索树和平衡二叉搜索树(avl树和旋转原理)

文章目录

  • 一、什么是二分查找
    • 1.定义和原理
    • 2.优势和局限
  • 二、二叉查找树的深入理解
    • 1.定义和原理
    • 2.优势和局限
  • 三、AVL树的诞生
    • 1.定义和原理
    • 2.平衡与失衡
    • 3.平衡旋转
  • 四、欢迎收看下一期数据结构篇:《003投影角度看红黑树和2-3树》

前言:这里要用到上一篇所提到的中序遍历==二叉树在x轴上的投影
和投影的降维效果。本篇主要是在理解avl树的平衡旋转原理上,需要对二分查找和二分搜索树有一定理解。

一、什么是二分查找

1.定义和原理

百度百科:二分查找也称折半查找(Binary Search),折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

个人理解:

  • 二分思想:按照一定比例划分一块区域,要么这边,要么那边(01思想)
  • 比例:目前了解到有1/2, 0.618(黄金比例,斐波那契比例)
  • 具体查找方法:二分查找(1/2),斐波那契查找(0.618)
  • 每次减少一定比例的元素O(logn)

    那么比例就会出现一个问题:
    如果比例为1,就是每次只比较最前面的元素,那么就会退化成顺序查找O(n)。

2.优势和局限

1.优势:如果比例选择恰当那么时间复杂度为O(logN)
2.局限:

  • 这种查找需要序列要先经过排序
  • 这个查找是静态的(如果现在要插入新元素就需要重新排序)
    3.那么有没有一种可以利用这种按比例查找并且可以动态插入和删除节点的算法呢?这个就是二叉查找树因此诞生。

二、二叉查找树的深入理解

1.定义和原理

百度百科:
1.若任意结点的左子树不空,则左子树上所有结点的值均不大于它的根结点的值。
2. 若任意结点的右子树不空,则右子树上所有结点的值均不小于它的根结点的值。
3.任意结点的左、右子树也分别为二叉搜索树。
它既有链表的快速插入与删除操作的特点,又有数组快速查找的优势

个人理解:(这个真的需要意会,言传很难好吧哈哈哈哈)

  • 算法角度:在递归中,每一个递归搜索(枚举)都可以画成一颗递归搜索树,而二叉搜索树相当于递归搜索过程中的一种剪枝策略(L
  • 数据结构角度:二叉搜索树是把一维的二分查找法变成二维的树状结构,提高了算法的扩展性和动态性。
  • 投影角度:一颗二叉查找树在x轴上的投影(也就是中序遍历)必定是一组有序序列L
    002投影角度看二分搜索树和平衡二叉搜索树(avl树和旋转原理)_第1张图片

2.优势和局限

1.优势:比一维的二分查找法有了很大的扩展性和动态性。时间复杂度平均在O(lonN)级别
2.局限:

  • 不同的序列顺序输入会有不同的形态,最差情况会退化成链表(就像二分查找法的比例没有选好一样:O(N))
  • 所以我们需要某种方法,让“比例”维持在1/2左右,也就是寻找左右节点数量平衡的方法(avl树的诞生)
  • 注意观察:下图两种形态的搜索树在X轴上的投影(中序遍历)都是:1 2 3 4 5
    002投影角度看二分搜索树和平衡二叉搜索树(avl树和旋转原理)_第2张图片

三、AVL树的诞生

1.定义和原理

百度百科:AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。

个人理解:

  • 首先是二叉搜索树(L
  • 平衡:每个节点的平衡因子范围为-1,0,1
  • 平衡因子 = 左子树高度 - 右子树高度
  • 两个节点组成的子树一定平衡(因为最多高度相差1),不平衡是出现在三个节点组成的子树

用二分查找的角度看平衡(个人理解):

  • 序列为奇数的时候,可以看出递归搜索树是从最中间的元素开始的(mid = (hig - low)/ 2 可以直接取整)
    递归搜索树在水平投影始终为:1 2 3 4 5 6 7002投影角度看二分搜索树和平衡二叉搜索树(avl树和旋转原理)_第3张图片
  • 序列为偶数的时候,因为无法直接找到中间取整元素,所以分两种情况
    • 向下取整(mid = (hig - low)/ 2 - 1)
      递归搜索树在水平投影始终为:1 2 3 4 5 6 7
      002投影角度看二分搜索树和平衡二叉搜索树(avl树和旋转原理)_第4张图片
    • 向上取整(mid = (hig - low)/ 2 + 1)
      递归搜索树在水平投影始终为:1 2 3 4 5 6 7
      002投影角度看二分搜索树和平衡二叉搜索树(avl树和旋转原理)_第5张图片

所以为了二叉搜索树查找的效率能保持在logN,需要调整每次查找的节点偏移在【-1,1】之间。

2.平衡与失衡

  • 因为失衡需要偏移 >=2,失衡只会发生有三个节点的子树上
  • 三个节点的子树只有五种形态:
    002投影角度看二分搜索树和平衡二叉搜索树(avl树和旋转原理)_第6张图片

可以看出第一种是平衡的,其余的都是偏移 >= 2。所以其他四种需要向第一种形态调整。
其他四种失衡类型分别是:LL型,LR型,RR型,RL型

3.平衡旋转

  1. 平衡旋转是为了调整树偏移的大小,所以旋转前后二叉搜索树树的根本性质是不变的 (在x轴上投影始终为L
  2. 教科书上的平衡旋转(相信很多人卡在这了):
    002投影角度看二分搜索树和平衡二叉搜索树(avl树和旋转原理)_第7张图片
    002投影角度看二分搜索树和平衡二叉搜索树(avl树和旋转原理)_第8张图片

但是我们用投影的角度看四种平衡旋转就没那么麻烦了

  1. 投影的角度看四种旋转:
    002投影角度看二分搜索树和平衡二叉搜索树(avl树和旋转原理)_第9张图片

不难理解:
(1)平衡旋转的过程是把三个节点的四种失衡类型向第一种平衡类型转化。
(2)因为调整过程中必须保持二叉搜索树的本质(在x轴上投影要保持原本的大小顺序,即把原来的结构投影到这样的结构上(如下图:)即可达到平衡)
002投影角度看二分搜索树和平衡二叉搜索树(avl树和旋转原理)_第10张图片
4. 例子:
002投影角度看二分搜索树和平衡二叉搜索树(avl树和旋转原理)_第11张图片

(1)失衡时和平衡后性质不变:T1 < C < T2 < B < T3 < A (2)把LL型的ABC三个节点投影到平衡型的ABC三个节点上。

四、欢迎收看下一期数据结构篇:《003投影角度看红黑树和2-3树》

写到最后:
这篇主要是以我理解的叙述较多,因为当时我学这些的时候就搞不懂为啥去平衡,怎样平衡,这样旋转为什么就可以和失衡到底是什么纠结了很久
做图真的好累呀,所以下一期红黑树估计会找找有什么网图可以用,但是东拼西凑排版就不是很好,希望大家谅解。
现在是2020年4月28日,会在毕业之前(2022)完成我的两个专栏(数据结构和算法)希望大家可以在留言给我宝贵的意见和支持。还有我的公众号,后期我会在公众号里放一些资料分享和相关文章的代码,谢谢大家支持。

002投影角度看二分搜索树和平衡二叉搜索树(avl树和旋转原理)_第12张图片

你可能感兴趣的:(001,新角度看数据结构)