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


    一、二叉排序树(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重要知识点回顾

    在这里插入图片描述

  • 相关阅读:
    问题求助 -MindSpore 训练问题
    由ASP.NET Core根据路径下载文件异常引发的探究
    【python】随机模拟——赶火车问题、醉汉回家
    如何保养维护实验室超声波清洗机
    Oracle/PLSQL: Upper Function
    【卷王秘籍】学了三遍操作系统后,榨干知识点,让面试官自闭!
    自动化python的简单使用
    C++ Balanced Braces
    C语言笔记22 •结构体•
    软件工程经济学--期末复习资料
  • 原文地址:https://blog.csdn.net/weixin_45579930/article/details/126466630