美文网首页数据结构DS 严蔚敏、吴伟民
数据结构学习第四弹 二叉排序树

数据结构学习第四弹 二叉排序树

作者: Richie_ll | 来源:发表于2016-10-02 18:31 被阅读84次

二叉排序树又称为二叉搜索树或二叉查找树,这是一种插入、删除和检索记录效率都很高的树结构

二叉排序树概念

二叉排序树,由名字可以看出他也是一颗二叉树,所以描述时和二叉树很相似。
二叉排序树有如下性质:

  • 若其左子树不为空,则左子树上所有结点的值均小于根结点的值
  • 若其右子树不为空,则右子树上所有节点的值均大于根结点的值
  • 左右子树也为二叉排序树

按照这样的性质描述来看,用中序遍历来遍历二叉排序树可以得到一个有序的序列。一般而言二叉排序树采用二叉链存储结构,描述如下:

typedef int KeyType;
typedef struct node
{
    KeyType data;
    struct node *leftChile;
    struct node *rightChild;
}BSTNode, *BiTree;

二叉排序树的基本运算

  • BSTSearch(bt,k): 在二叉排序树bt中,查找值为k的结点
  • BSTInsert(bt,k): 在二叉排序树bt中,插入值为k的结点
  • CreatBST(bt,arr,n): 创建二叉排序树
  • DispBST(bt): 输出二叉排序树
  • BSTDelete(bt,k): 删除结点

查找结点

查找方法:将给定的k值与根结点进行比较,若相等则查找成功,否则:

  • 当k值小于根结点时,查找在左子树进行下去
  • 当k值大于根结点时,查找在右子树进行下去
  • 当查找成功则返回,否则一致查找到子树为空为止
BSTNode* BSTSearch(BSTNode *bt,KeyType k)
{
    BSTNode* p = bt;
    while(p!=NULL && p->data!=k)
    {
        if(k>p->data)               //沿着右子树查找
            p = p->rightChild;
        else if(k<data)             //沿着左子树查找
            p = p->leftChile;
    }
    return p;
}

插入结点

每一个新加入的结点作为叶子结点加入到二叉排序树当中

void BSTInsert(BSTree &bt,KeyType k)
{
    //为新结点申请空间
    BSTree p = bt;
    p = (BSTree)malloc(sizeof(BSTNode));
    p->data = k;
    p->leftChild = NULL;
    p->rightChild = NULL;
    //查找二叉排序树
    //若原本的树为空,则设为根结点
    if(bt==NULL)
        bt=p;
    else
    {
        //在已有的二叉排序树中查找找到合适的位置插入
        if(bt->data >= k)
        {
            if(bt->leftChild == NULL)
                bt->leftChild = p;
            else
                BSTInsert(bt->leftChild,k);
        }
        else
        {
            if(bt->rightChild == NULL)
                bt->rightChild = p;
            else
                BSTInsert(bt->rightChild,k);
        }
    }
}

二叉排序树的建立

二叉排序树的建立其实就是把每一个元素插入到

void CreateBST(BSTree &bt,KeyType str[],int n)
{
    bt = NULL;
    for(int i=0;i<n;i++)
        BSTInsert(bt,str[i]);
}

二叉排序树的输出

其实二叉排序树的输出就是对二叉树的遍历,根据二叉排序树的性质可以知道
中序遍历的结构就是一个有序的数列

void DispBST(BSTNode *bt)
{
    if(bt==NULL)
        return ;
    DispBST(bt->leftChild);
    printf("%d ",bt->data);
    DispBST(bt->rightChild);
}

二叉排序树是一种动态的数据结构,它的运算大都是基于查找运算的,查找的次数与树的深度(层数)有关,这样,有n个结点的二叉排序树的平均查找长度就和树的形态有关。如果形态接近或为完全二叉树,则平均查找次数的数量级为log2n,如果给出的n个关键字是有序的,那么建立的二叉排序树就是一棵单枝树,这样的查找长度就为(n+1)/2,不过已知是有序的关键字的话,为什么不用二分查找呢......

相关文章

  • 数据结构学习第四弹 二叉排序树

    二叉排序树又称为二叉搜索树或二叉查找树,这是一种插入、删除和检索记录效率都很高的树结构 二叉排序树概念 二叉排序树...

  • 彻底弄懂二叉排序树

    彻底弄懂二叉排序树 前言 在之前学习数据结构的时候,就学过二叉排序树,不过,由于但是只是纸上谈兵,虽然知道二叉排序...

  • 2018-06-19/20 机试准备09

    数据结构 四、二叉排序树 对二叉排序树进行中序遍历 结果必然是一个递增序列 所以通过建立二叉排序树可以对无序序列进...

  • 数据结构05-二叉排序树

    数据结构05-二叉排序树 一、二叉排序树的介绍 二叉排序树 或者是一颗空树,或者是一颗具有如下性质的树: 若左子...

  • 数据结构实验之查找一:二叉排序树

    数据结构实验之查找一:二叉排序树 Time Limit: 400MS Memory Limit: 65536KB ...

  • 数据库索引

    索引的本质 索引是帮助MySQL高效获取数据的排好序的数据结构 索引的数据结构 二叉排序树 红黑树(二叉平衡树) ...

  • 数据结构学习第四弹 树与森林

    在前面已经介绍过了二叉树的存储结构,那么对于一般的树来说,他的存储结构又该是怎么样的呢。 树的存储结构 树存储结构...

  • 哈希算法

    哈希(Hash)或者说散列表,它是一种基础数据结构。Hash 表是一种特殊的数据结构,它同数组、链表以及二叉排序树...

  • iOS标准库中常用数据结构和算法之二叉排序树

    上一篇:iOS标准库中常用数据结构和算法之排序 ?二叉排序树 功能:二叉排序树的标准实现是一颗平衡二叉树。二叉排序...

  • 平衡二叉树

    1. 为什么会出现平衡二叉树这种数据结构? 之前学习了二叉排序树,假如现有数列:1,2,3,4,5,要用这个数列创...

网友评论

    本文标题:数据结构学习第四弹 二叉排序树

    本文链接:https://www.haomeiwen.com/subject/gwudyttx.html