动态查找表

动态查找表

  • 1.二叉排序树
    • 1.1. 定义
    • 1.2. 查找过程
    • 1.3. 插入过程
    • 1.4. 创建二叉排序树
    • 1.5. 删除操作
      • (1)被移除的结点是叶子结点
      • (2)被移除的结点只有左子树或者只有右子树;
      • (3)被移除的结点既有左子树,也有右子树。
    • 1.6 性能分析
  • 2.平衡二叉树
    • 2.1 定义
    • 2.2. 插入时的最小不平衡子树
    • 2.3. 最小不平衡子树调整类型
      • LL型
      • RR型
      • LR型
      • RL型
    • 2.4 平衡二叉树的查找分析
    • 2.5 平衡二叉树的结点删除
      • 平衡二叉树删除结点后的处理
      • 最小不平衡子树类型的确定

动态查找表_第1张图片

1.二叉排序树

动态查找表_第2张图片

1.1. 定义

或者是一棵空树;或者是具有如下特性的二叉树:

  1. 若它的左子树不空,则左子树上所有结点的值均小于根结点的值;
  2. 若它的右子树不空,则右子树上所有结点的值均大于根结点的值;
  3. 它的左、右子树也都分别是二叉排序树。

动态查找表_第3张图片

二叉排序树的中序序列是一个有序的序列

1.2. 查找过程

动态查找表_第4张图片

在查找过程中,逐步缩小查找范围的过程,并生成了一条查找路径

【算法描述】
动态查找表_第5张图片

1.3. 插入过程

  • 插入的结点只能是叶子结点
  • 插入是基于查找失败情况下插入的

动态查找表_第6张图片

动态查找表_第7张图片
动态查找表_第8张图片
动态查找表_第9张图片

当二叉排序树为空时,插入操作会改变指向根结点的指针,所以p是BiTree *类型的,*p是p指向的对象。

1.4. 创建二叉排序树

二叉排序树在查找的过程中从无到有,动态生成

动态查找表_第10张图片
【插入算法】
动态查找表_第11张图片
【创建算法】
动态查找表_第12张图片

1.5. 删除操作

要求: 确保移除之后,依然保持排序

存在三种情况:

(1)被移除的结点是叶子结点

动态查找表_第13张图片
删除操作中的指针变量p在查找过程中存放的是结点左孩子变量或右孩子变量的地址,*p是结点的左孩子或右孩子变量。一旦查找成功,*p中存放的是待删结点的地址,*p指向待删除结点。q记被删除的结点,以便释放被删除结点的空间

(2)被移除的结点只有左子树或者只有右子树;

动态查找表_第14张图片
动态查找表_第15张图片

(3)被移除的结点既有左子树,也有右子树。

前驱替换方案:找到被删除结点的中序前驱(即左分支中的最大值),替换待删结点的值,并删除该前驱。
动态查找表_第16张图片

动态查找表_第17张图片
注意:左分支是否是左单分支

动态查找表_第18张图片
动态查找表_第19张图片
动态查找表_第20张图片
先找到在删除
动态查找表_第21张图片
【删除描述】
动态查找表_第22张图片
动态查找表_第23张图片

1.6 性能分析

动态查找表_第24张图片
树的形状取决于关键字集合和插入次序

所以,为了保证二叉排序树的左右结点数均分,要在插入的时候进行调整,构建平衡二叉树

2.平衡二叉树

动态查找表_第25张图片

2.1 定义

什么样的二叉排序树是平衡二叉树?

结点的平衡因子:该结点的左子树的深度H L 与右子树的深度H R 之差

平衡二叉树:或者是一棵空的二叉排序树,或者是具有下列性质的二叉排序树:

  1. 根结点的左子树和右子树的平衡因子为-1、0或1;
  2. 根结点的左子树和右子树也都是二叉平衡树。

结点的平衡因子=左子树的深度H L - 右子树的深度H R
动态查找表_第26张图片
动态查找表_第27张图片
现象:一棵平衡二叉树,结点的插入或删除,都可能会导致失衡

最小不平衡子树:失衡的结点及其关联结点构成的是一棵高度为2的子树,由三个结点、两条边构成。

对策:针对这棵子树,做平衡化处理(Rebalance)

2.2. 插入时的最小不平衡子树

平衡因子的计算:每当插入一个新结点时,都需要重新计算从新插入的结点到根结点的
路径上所包含结点的平衡因子,一旦找到失衡点,停止计算。

最小不平衡子树:在根到插入结点的查找路径中,以距离插入结点最近的、且平衡因子
的绝对值大于1的结点为根,沿此查找路径再找两个结点构成这棵最小不平衡子树。
动态查找表_第28张图片
最小不平衡子树的调整再平衡(Rebalance)

在保持二叉排序树特性的前提下,调整最小不平衡子树中各结点之间的链接关系,进行相应的旋转,将最小不平衡子树的高度2降低到高度1,使之成为新的平衡子树

动态查找表_第29张图片

2.3. 最小不平衡子树调整类型

动态查找表_第30张图片

LL型

动态查找表_第31张图片
动态查找表_第32张图片

RR型

动态查找表_第33张图片
动态查找表_第34张图片

LR型

动态查找表_第35张图片
动态查找表_第36张图片

RL型

动态查找表_第37张图片
动态查找表_第38张图片

2.4 平衡二叉树的查找分析

动态查找表_第39张图片

2.5 平衡二叉树的结点删除

动态查找表_第40张图片

平衡二叉树删除结点后的处理

动态查找表_第41张图片

最小不平衡子树类型的确定

动态查找表_第42张图片
【例题】

动态查找表_第43张图片

你可能感兴趣的:(数据结构,算法,数据结构,排序算法)