搜索结构

SyEic_L Lv4
  • 静态搜索结构
  • 二叉搜索树
  • AVL树

静态搜索结构

  • 每个对象有若干属性,其中一个属性可以唯一标识对象,称为关键码
  • 两种环境
    • 静态环境——静态搜索表
    • 动态环境——动态搜素表

二叉搜索树

  • 每个节点都有一个关键码,所有关键码互不相同
  • 左子树上所有节点的关键码都小于根节点的关键码
  • 右子树上所有节点的关键码都大于根节点的关键码
  • 左右子树都是二叉搜索树

搜索

  • 根节点为NULL,则搜索不成功
  • 用给定值x与根节点关键码比较
    • 如果等于,则成功
    • 小于,递归搜索左子树
    • 大于,递归搜索右子树

插入

  • 先搜索元素是否存在
    • 成功:已有元素,不再插入
    • 失败:把新元素加到搜索停止的地方
  • 建立二叉树为插入过程

删除

  • 保证删除并重新链接后性质不失去

  • 保证搜索性能不至于降低,还需要防止重新链接后树的高度增加

  • 首先查找,确定被删除节点在二叉搜索树中

  • 分情况讨论:

    • 删除叶节点:直接删除
    • 删除节点左子为空或右子为空:删除并用右子或左子顶替位置
    • 左右子树都不为空(二选一)
      • 在右子树中找最小的节点,填补到被删节点,再处理这个节点的删除问题
      • 在左子树中找最大的节点,填补到被删节点,再处理这个节点的删除问题

AVL树(高度平衡的二叉搜索树)

可视化工具:AVL Tree Visualzation

AVL是空树或者具有以下性质的二叉搜索树:左右子树都是AVL树,且左右子树高度差绝对值不超过1

节点的平衡因子balance:每个节点附加一个数字——该节点右子树与左子树的高度差

  • AVL树任一节点的平衡因子只能取-1,0,1
  • 如果一个节点平衡因子的绝对值大于1,则失去平衡,不再是AVL树
  • 如果一个二叉搜索树是高度平衡,且有n个节点,则平均搜索长度可保持在O(log2n)O(log_2n)

平衡化旋转

  • 两类
    • 单旋转(左旋和右旋)
    • 双旋转(左平衡和右平衡)
  • 每插入一个新节点时,AVL树中相关节点的平衡状态会发生改变,需要从插入位置沿通向根的路径回溯,检查各节点的平衡因子
  • 如果在某一节点发现高度不平衡,停止回溯,从发生不平衡的节点起,沿刚才回溯的路径取直接下两层的节点
  • 如果这三个节点处于一条直线上免责采用单旋转平衡化左单旋转
  • 如果这三个节点处于一条折线上,则采用双旋转进行平衡化:分为先左后右和先右后左先左后右双旋转

AVL树的插入

  • 插入新节点,如果不平衡,需要做平衡化处理
  • 建树从空树开始,逐步插入新节点

AVL树的删除

  • 如果被删节点x最多只有一个子女:

    • 将节点x从树中删去
    • 因为最多有一个子女,可以简单的把x的双亲节点中原来指向x的指针改到这个子女节点
    • 如果x没有子女,x双亲节点的指针置位NULL
    • 将原来以节点x为根的字数高度-1,调整
  • 如果x有两个子女:

    • 搜索x在中序下的直接前驱y(左子树的最右一个)或者直接后继(右子树的最左一个)
    • 把y的内容传送给节点x,问题转移到删除节点y
    • 因为节点y最多有一个子女,变为上述删除方法
  • 用一个bool shorter来指明子树高度是否变化

  • 如果shorter是true,则从x的双亲到根的路径上的各个节点p,在shorter保持true是执行下列操作,变为false,终止

    • p的balance为0,如果他的左子树或右子树变短,则balance改为1或-1,同时shorter变为false

    • p的balance不为0且较高的子树被缩短,则p的balance改为0,同时shorter变为true

    • p的balance不为0且较矮的子树被缩短,则在p不平衡,进行平衡化旋转:

      3种情况:

      令p的较高的子树的根为q,根据q的balance

      • q的balance为0,执行单旋转,shorter变为false

        AVL删除1

      • q的balance与p的balance相同,执行单旋转,p和q的balance均改为0,同时shorter为true

        AVL删除2

      • p与q的balance相反,执行双旋转,先绕q转,再绕p转,新根balance变为0,其他节点的balance相应处理,shorter为true

        AVL删除3

AVL树的高度

  • n个结点的AVL树的高度不超过1.44log2(n+2)1.3281.44*log_2{(n+2)}-1.328
  • AVL树删除一个节点并做平衡化旋转的时间为O(log2n)O(log_2n)
  • 适合于组织在内存中较小的索引(或目录),较大的文件系统不合适
  • 文件检索系统中大量使用的是B-树或B+树做文件检索
  • Title: 搜索结构
  • Author: SyEic_L
  • Created at : 2026-03-12 17:43:03
  • Updated at : 2026-03-12 17:43:03
  • Link: https://blog.syeicl.vip/2026/03/12/搜索结构/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments