数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)

文章目录

  • 平衡二叉树
    • 总览
    • 平衡二叉树的定义
    • 平衡二叉树的插入
    • 调整最小不平衡子树
      • 在A的左孩子的左子树中插入导致不平衡
      • 在A的右孩子的右子树中插入导致不平衡
      • 上述两种的代码思路
      • 在A的左孩子的右子树中插入导致不平衡
      • 在A的右孩子的左子树中插入导致不平衡
    • 填个坑
    • 练习
    • 查找效率分析
    • 小结
  • 平衡二叉树的删除
    • 删除的节点是叶子-例1
    • 删除的节点是叶子-例2
    • 删除的节点是叶子-例3
    • 删除的节点是叶子-例4
    • 删除的节点是有左右子树的-例5
    • 删除的节点是有左右子树的-例6
    • 小结

平衡二叉树

总览

数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第1张图片

平衡二叉树的定义

保存平衡查找长度小些
数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第2张图片

平衡二叉树的插入

插入后,再调整树使其恢复平衡。

数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第3张图片
调整过后发现恢复平衡
数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第4张图片

调整最小不平衡子树

数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第5张图片
规律
左孩子右旋
右孩子左旋
数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第6张图片

在A的左孩子的左子树中插入导致不平衡

数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第7张图片
关于为什么所有子树的高度都是h是因为如果h+1或者h-1,那么插入后要不最小不平衡子树不是A,要不插入后没有最小不平衡子树,要不在插入前就已经出现最小不平衡子树了。总而言之都不满足假设的情况

在A的右孩子的右子树中插入导致不平衡

与上面的情况差不多,只不过改的位置不一样而已
数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第8张图片

上述两种的代码思路

都是先更新A节点的子树为b的某个子树,然后再更新b的子树节点为f,最后再更新原来f的父节点中的子节点为b
数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第9张图片

在A的左孩子的右子树中插入导致不平衡

数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第10张图片
先左旋后右旋的结果
数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第11张图片
此时对应插入到c的左右子树两种情况
数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第12张图片

在A的右孩子的左子树中插入导致不平衡

数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第13张图片
先右旋再左旋的过程
数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第14张图片
数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第15张图片

填个坑

数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第16张图片
最小不平衡子树调整好后其父亲树都会调整平衡
数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第17张图片

练习

插入后,找到最小不平衡子树,让孩子旋转
数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第18张图片

数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第19张图片
再插入
数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第20张图片
数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第21张图片
数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第22张图片
再插入
数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第23张图片
数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第24张图片

查找效率分析

由平衡二叉树可知道高度为h的平衡二叉树的节点最少的话是由一个根节点和两个子树构成,其中一颗子树为高度为h-1的最少节点数所构成的平衡二叉树,此时可以满足该树深度为h,而另一颗子树为高度为h-2的最少节点数所构成的平衡二叉树即可,若也为h-1的最少节点数所构成的平衡二叉树,那么此时没必要,节点相比与高度为h-2的最少节点数所构成的平衡二叉树多了,所以为h-2的即可
数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第25张图片

小结

数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第26张图片

平衡二叉树的删除

删除节点后,也要维持平衡二叉树的平衡

数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第27张图片

删除的节点是叶子-例1

数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第28张图片

数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第29张图片

删除的节点是叶子-例2

先删节点
数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第30张图片
然后先上找到最小不平衡子树的根节点,同时找到该个头最高的儿子和孙子
数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第31张图片
根据孙子位置,调整
此时80左旋
数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第32张图片

删除的节点是叶子-例3

数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第33张图片
数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第34张图片
数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第35张图片
数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第36张图片

删除的节点是叶子-例4

数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第37张图片
数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第38张图片
此时调整完后发现不平衡了,此时从调整后的子树继续向上传导,找到最小不平衡子树
数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第39张图片
数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第40张图片
数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第41张图片
数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第42张图片
数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第43张图片
右旋后,不平衡特性没有向上传到了

删除的节点是有左右子树的-例5

两种顶替的策略
数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第44张图片
转换为删除的节点只有一个子树的类型
数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第45张图片
删除后
数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第46张图片
往上找最小不平衡子树,儿子左旋一次即可
数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第47张图片
数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第48张图片
没有向上传导

删除的节点是有左右子树的-例6

此时用后继节点顶替
数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第49张图片
转换为删除叶子节点
数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第50张图片
此时向北找到最小不平衡子树
此时孙子个头一样,所以选哪个作为个头最高的孙子
假设此时为右孙子为个头最高
此时儿子左旋一次即可
数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第51张图片
假设此时左孙子为个头最高

数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第52张图片
此时孙子先右旋
数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第53张图片
再左旋,此时不平衡无向上传导
数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第54张图片

小结

旋转后子树变矮导致上层祖先不平衡
注意平衡二叉树删除操作的时间复杂度和插入的时间复杂度是一样的
数据结构和算法-平衡二叉树(定义 插入 删除 时间复杂度)_第55张图片

你可能感兴趣的:(王道数据结构和算法考研笔记,数据结构,算法)