美文网首页数据结构和算法分析互联网科技程序员
小朋友学数据结构(15):二叉排序树

小朋友学数据结构(15):二叉排序树

作者: 海天一树X | 来源:发表于2018-09-16 18:56 被阅读27次

二叉排序树会用到指针的指针,在学习二叉排序树之前,请先了解
小朋友学C语言(41):二级指针与多级指针

代码:

#include<iostream>
using namespace std;

typedef struct BiTNode
{
    int data;
    struct BiTNode *lchild, *rchild;
}BiTnode, *Bitree;
typedef bool status;

status biSearch(Bitree t, int key, Bitree f, Bitree *p)
{
    if (!t)
    {
        *p = f;
        return false;
    }
    else if (key == t->data)
    {
        *p = t;
        return true;
    }
    else if(key < t->data)
    {
        return biSearch(t->lchild, key, t, p);
    }
    else
    {
        return biSearch(t->rchild, key, t, p);
    }
}

status biInsert(Bitree *root, int key)
{
    Bitree p, s;
    if (!biSearch(*root, key, NULL, &p))
    {
        s = (Bitree)malloc(sizeof(BiTnode));
        s->data = key;
        s->lchild = s->rchild = NULL;
        if (!p)
        {
            *root = s;
        }
        else if (key < p->data)
        {
            p->lchild   = s;
        }
        else
        {
            p->rchild = s;
        }
        return true;
    }
    else
    {
        return false;
    }
}

status Delete(Bitree *p)
{
    Bitree q, s;
    if ((*p)->lchild == NULL)
    {
        q = *p;
        *p = (*p)-> lchild;
        free(q);
    }
    else if ((*p)->rchild == NULL)
    {
        q = *p;
        *p = (*p)-> rchild;
        free(q);
    }
    else
    {
        q = *p;
        s = (*p)->lchild;
        while (s->rchild)
        {
            q = s;
            s = s->rchild;
        }
        (*p)->data = s->data;
        if (q != *p)
        {
            q->rchild = s->lchild;
        }
        else
        {
            q->lchild = s->lchild;
        }
        free(s);
    }
    return true;
}

status biDel(Bitree *t, int key)
{
    if (!*t)
    {
        return false;
    }
    else
    {
        if (key == (*t)->data)
        {
            return Delete(t);
        }
        else if (key < (*t)->data)
        {
            return biDel(&(*t)->lchild, key);
        }
        else
        {
            return biDel(&(*t)->rchild, key);
        }
    }
}

void inOrder(Bitree &root)
{
    if (NULL != root)
    {
        inOrder(root->lchild);
        printf("%d ", root->data);  //访问结点
        inOrder(root->rchild);
    }
}

int main()
{
    int a[] = {62, 88, 58, 47, 35, 73, 51, 99, 37, 93, 29, 49, 56, 36, 48, 50};
    int len = sizeof(a) / sizeof(int);
    Bitree t = NULL;
    for (int i = 0; i < len; i++)
    {
        biInsert(&t, a[i]);
    }

    inOrder(t);
    cout << endl;

    Bitree p = NULL;
    cout << biSearch(t, 99, NULL, &p) << endl;

    cout << biDel(&t, 47) << endl;

    inOrder(t);
    cout << endl;

    return 0;
}

运行结果:

29 35 36 37 47 48 49 50 51 56 58 62 73 88 93 99
1
1
29 35 36 37 48 49 50 51 56 58 62 73 88 93 99

了解小朋友学编程请加QQ307591841(微信与QQ同号),或QQ群581357582。

相关文章

  • 小朋友学数据结构(15):二叉排序树

    二叉排序树会用到指针的指针,在学习二叉排序树之前,请先了解小朋友学C语言(41):二级指针与多级指针 代码: 运行...

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

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

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

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

  • 彻底弄懂二叉排序树

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

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

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

  • 数据库索引

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

  • 哈希算法

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

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

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

  • 七、二叉树(八)、二叉排序树

    数据结构目录[https://www.jianshu.com/p/c22b5cb2d79b] 一、定义 二叉排序树...

  • 小朋友学数据结构(2):栈

    栈是一种先入后出的数据结构。如下图所示,入栈的顺序为1、2、3;出栈的顺序则反过来:3、2、1。 可以想象往一个箱...

网友评论

    本文标题:小朋友学数据结构(15):二叉排序树

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