关联式容器构造【搜索二叉树】

搜索二叉树

二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:

  1. 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
  2. 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
  3. 它的左右子树也分别为二叉搜索树
    在这里插入图片描述

构造二叉树

  1. 树为空,直接插入
  2. 树不为空,根据搜索二叉树性质,与左右子树进行比较,找到适合放置的叶子节点
    若增加的数为已有的,则增加失败

首先判断节点是否存在
再进行删除操作

1. 叶子节点:直接删除
2. 非叶子节点:
    此节点没有左(右)孩子:
        重新连接要删除节点的父节点和要删除节点的子树
        parent = 被删除节点的右(左)子树的根
    如果删除的节点有左右孩子,更新节点
        1. 找到左子树的最右节点,或者右子树的最左节点
        2. 与被删除节点交换
        3. 删除目标节点,置空删除位置

  1. 树为空,返回查找失败
  2. 树不为空,根据搜索二叉树性质,与左右子树进行比较,沿着子树查找数值相同的值
    若查找的不存在,返回空

实现

性能分析

插入和删除操作都必须先查找,查找效率代表了二叉搜索树中各个操作的性能

对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度的函数,即结点越深,则比较次数越多

但对于同一个关键码集合,如果各关键码插入的次序不同,可能得到不同结构的二叉搜索树

最优情况下,二叉搜索树为完全二叉树,其平均比较次数为:log(n)
最差情况下,二叉搜索树退化为单支树,其平均比较次数为:n / 2

map/multimap/set/multiset这几个容器有个共同点是:其底层都是按照二叉搜索树来实现的

发布了51 篇原创文章 · 获赞 113 · 访问量 5982

猜你喜欢

转载自blog.csdn.net/qq_44759710/article/details/104523391