[Data Structure & Algorithm] 二叉排序树

二叉排序树 BST

  • 性质
    • 若左子树非空,则左子树上所有记录的值<(=)根记录的值
    • 若右子树非空,则右子树上所有记录的值>(=)根记录的值
    • 左右子树本身又是一颗二叉排序树
    • 按中序遍历,可以得到一个递增有序序列
  • 空树也是二叉排序树
    • 即 构造二叉排序树 = 二叉排序树的插入操作
  • 存储 - 一般用二叉链表

二叉排序树的插入

  • 基本思路
    1.如果二叉树为空,把要插入的关键字作为根结点
    2.如果二叉树不为空,将要插入的关键字和根结点比较,大于根结点的插入到右子树,否则插入到左子树

二叉排序树的查找

  • 基本思路
    1.将要查找的关键字和根结点比较
    2.1如果=根结点,直接返回
    2.2如果>根结点,到右子树中查找
    2.3如果<根结点,到左子树中查找
    3.重复1,2,直到找到相等的值或查询到空结点
  • 平均查找长度 ABL
    • 含有n个结点的二叉排序树的ABL不唯一,取决于树的形态
      • 最慢 - (n+1)/2
        • 构造时插入顺序表 - 与顺序查找相同
      • 最快 - log2n
        • 与折半查找的判定树的形态相同

二叉排序树的删除

  • 基本思路
    1.查找要删除的关键字,令p指向该关键字,f指向该关键字的父结点
    2.1 如果p为叶子结点,直接删除
    2.2 如果
    p只存在一个子树,将p的子树直接和f相连
    2.3 如果p左右子树都存在,
    方法一 - 将
    p的左子树s(中序序列中的直接前驱)直接和f相连,再把p的右子树作为s的右子树
    方法二 - 将p的左(或右)子树s(中序序列中的直接前驱(或后继))与p交换位置,再删除p,此时*p只会有左(或右)子树,或者无子树,可以参考2.2
posted @ 2018-10-21 13:39  break大蜗牛  阅读(166)  评论(0编辑  收藏  举报