(二十一)数据结构-二叉排序树、平衡二叉树、散列查找

一、二叉排序树(BST)

1.1定义

二叉排序树(也称为二叉查找树)或者是一颗空树,或者是具有下列特性的二叉树:

  1. 若左子树非空,则左子树上所有节点的值均小于根节点的值
  2. 若右子树非空,则右子树上所有结点的值均大于根节点的值
  3. 左、右子树也分别是一颗二叉排序树

根据二叉排序树的定义,左子树的结点值<根结点<右子树结点值,所以对二叉排序树进行中序遍历,可以得到一个递增有序序列

1.2二叉排序树的插入

若原二叉排序树为空,则直接插入结点;
否则,若关键字k小于根结点值,插入到左子树
关键字k大于根结点值,则插入到右子树

1.3二叉排序树的删除

  1. 被删除的结点为叶子结点,直接删除

  2. 被删除的结点只有左子树或者右子树,用其子树顶替其位置

    1. 举例子:若要删除的是60这个结点
    2. 只需要将60的子树代替他的位置即可在这里插入图片描述

    在这里插入图片描述

  3. 被删结点有左、右子树

    1. 方法一:可以用后继结点顶替,再删除后继结点(后继:左子树中右下的结点 )
    2. 方法二:可以用前驱结点顶替,再删除前驱结点(前驱结点:左子树中最右下的结点 )
      1. 举例子:若要删除的是50这个结点,由于他有左子树和右子树
      2. 使用方法一:由于我们二叉排序树进行中序遍历,可以得到一个递增的有序序列,
      3. 所以我们找到按照中序遍历的第一个结点,此结点一定是右子树中值最小的,为60
      4. 用最小的值(60)去替代,要删除的根节点,即可以保证排序树的特性不变在这里插入图片描述
        在这里插入图片描述
      5. 由于60是最左下的结点,所以他是没有左子树的,那么接下来就转变为没有左子树的情况,因此只要用他的右子树来代替即可
        在这里插入图片描述
  4. 使用方法二:用前驱结点来替代(取当前结点左子树中最大的值来替代当前要被删除的结点)

  5. 最右下的结点是他的直接前驱(30),用30替代50

  6. 由于30是最右下的结点,所以他肯定没有右子树或者根结点的,则转换为第一种或者第二种情况
    在这里插入图片描述

1.4二叉排序树的查找效率

在这里插入图片描述
在这里插入图片描述

二、平衡二叉树(AVL)

2.1定义

平衡二叉树——树上任一结点的左子树和右子树高度之差不超过1,只要有任意结点的平衡因子绝对值大于1就不是平衡二叉树
结点的平衡因子 = 左子树高 - 右子树高

(平衡因子的值只可能是-1、0、1

2.2如何保持二叉树的平衡

从插入点往后找第一个不平衡的结点为根的子树,每次调整的对象都是“最小不平衡子树 ”

2.3平衡二叉树的插入

2.3.1调整最小不平衡子树

  1. 恢复平衡
  2. 保持二叉排序树特性
2.3.1“LL”——在A的左孩子的左子树插入导致A不平衡,将A的左孩子右上旋

在这里插入图片描述

2.3.2查找效率

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3.3知识点回顾

在这里插入图片描述

2.4平衡二叉树的删除

例1:删除9

  1. 通过步骤1,由于是叶子结点直接删除;
  2. 通过步骤2 ,由于没有找到最小不平衡子树,所以直接删除9即可
    在这里插入图片描述
    例2:删除55(在删除9结点之后的图中)
  3. 通过步骤1,由于55是叶子结点直接删除;
  4. 通过步骤2 ,找到最小不平衡子树(75),在删除55之后,75的左子树高度是60,右子树高度是3,出现不平衡现象
  5. 通过步骤3:调整不平衡,找到个头最高的“儿子、孙子”;
    1. 可以发现右边的个头最高,那么就是80这个结点
    2. 再从个头最高的“儿子”找到个头最高的孙子,可以发现是90
      在这里插入图片描述
  6. 步骤4:调整平衡
    因为孙子(90)在是在右孩子的右子树,则孙子是RR,所以儿子(80)左单旋转
    在这里插入图片描述
  7. 步骤5:由于通过左旋后,50的右子树高度由4变成3,也会有可能导致80的祖先(50)出现不平衡的现象,所以这就是不平衡的向上传导现象

例3:删除32

在这里插入图片描述

在这里插入图片描述

  1. 进行右旋操作:
    孙子(50)先右旋(到达78位置)让78成为50右的孩子,50原本的右孩子62变成78的左孩子
    1. 再左旋(到达44)
      在这里插入图片描述
  2. 再进行左单旋:
    1. 让50上升到最高位置(50代替44),左旋后44变成50的左孩子
      在这里插入图片描述

例子4:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.5知识点回顾

重点领会例子1-4
在这里插入图片描述

三、散列表(哈希表)

3.1定义

散列表又称哈希表,是一种数据结构,特点:数据元素的关键字与其存储地址相关

3.2散列查找

在这里插入图片描述
查找成功:
在这里插入图片描述
查找失败:有的教材会把“空指针”的判定作为一次比较
在这里插入图片描述
在这里插入图片描述
查找成功平均长度:
在这里插入图片描述
在这里插入图片描述

查找失败的平均长度:
分子是存储了多少个,分母是散列表的长度
在这里插入图片描述

3.3装填因子

在这里插入图片描述

3.4设计散列函数

3.4.1除留余数法

首先要知道的概念:质数:除了能被1和自己整除之外,不能被其他数除
eg.8能被2、4除,所以不是
3、7都是质数
在这里插入图片描述

3.4.2直接定址法

适合分布连续的情况
在这里插入图片描述

3.4.3数字分析法

在这里插入图片描述

3.4.4平方取中法

在这里插入图片描述
在这里插入图片描述

3.5处理冲突方法

  1. 线性探测法
  2. 平方探测法
  3. 伪随机序列法

3.6重要知识点回顾

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值