首页 > 编程语言 > 详细

二叉排序树

时间:2020-04-19 17:00:20      阅读:45      评论:0      收藏:0      [点我收藏+]

【1】编写SearchBST(T, key)与InsertBST(T, key)的伪代码,并实现

BTree Search(BTree bt, keytype k)
{
    /*伪代码
    if(bt=NULL或bt->key=k)
    return bt;
    if(k>bt->key)
    return Search(bt->rchild,k)
    else 
    return Search(bt->lchild,k)
    */
    if (bt == NULL || bt->key == k)
        return bt;
    if (k > bt->key)
        return Search(bt->rchild, k);
    else
        return Search(bt->lchild, k);
}
int Insert(BTree &bt, keytype k)
{
    /*伪代码
    if(bt=NULL)
    {
       建立新节点bt;
       bt->key=k;
       bt左右孩子都为空;
     }
     if(bt->key=k)
     不需要插入,return 0;
     if(k>bt->key)
     return Insert(bt->rchild,k);
     if(k<bt->key)
     return Insert(bt->lchild,k);
      */
    if (bt == NULL)
    {
        bt = new BTNode;
        bt->key = k;
        bt->rchild = NULL;
        bt->lchild = NULL;
        return 1;
    }
    else if (k == bt->key)
        return 0;
    else if (k > bt->key)
        return Insert(bt->rchild, k);
    else
        return Insert(bt->lchild, k);
}

【2】编写CreateBST(T)的伪代码实现从控制台输入创建BST树。最后使用代码实现。使用“50 30 80 20 40 90 10 25 35 85 23 88”创建BST,并中序输出该BST

BTree Creat(int n)
{
    /*
    创建头指针,设为空;
    用循环依次输入、插入节点;
    return 根节点;
    */
    BTree bt = NULL;
    int i, x;
    for (i = 0; i < n; i++)
    {
        cin >> x;
        Insert(bt, x);
    }
    return bt;
}

技术分享图片

【3】编写DeleteBST(T, key)的伪代码实现从T中删除关键字key。如果无法编写出来,请写出在BST中删除关键字key所需注意的事项

int Delete1(BTree &bt,keytype k)
{
    /*伪代码
    if(bt为空)
    return 0;
    else if(k>bt->key) return Delete1(bt->rchild,k);
    else if(k<bt->key) return Delete1(bt->lchild,k);
    else {
       Delete2(bt);
       return 1;
     }
    */
    if (bt == NULL)
        return 0;
    if (k > bt->key)
        return Delete1(bt->rchild, k);
    if (k < bt->key)
        return Delete1(bt->lchild, k);
    if (k == bt->key)
    {
        Delete2(bt);
        return 1;
    }
}
void Delete2(BTree& bt)
{
    /*伪代码
    if(bt->rchild和bt->lchild都为空)
        free(bt);
    if(bt->rchild为空)
    {
       将它父亲的左孩子指向它的左孩子;
       free(bt);
    }
    if(bt->lchild为空)
    { 
       将它父亲的右孩子指向它的右孩子;
       free(bt);
    }
    */
    BTree p;
    if (bt->rchild == NULL && bt->lchild == NULL)
        free(bt);
    if (bt->rchild == NULL)
    {
        p = bt;
        bt = bt->lchild;
        free(p);
    }
    if (bt->lchild == NULL)
    {
        p = bt;
        bt = bt->rchild;
        free(p);
    }
    if (bt->lchild != NULL && bt->rchild != NULL)
        Delete3(bt, bt->lchild);
}
void Delete3(BTree& bt,BTree& t)
{
    /*伪代码
    if(t->rchild不为空) Delete3(bt,t->rchild);
    else {
    将t->key赋给bt;
    free(bt);
    }
    */
    BTree p;
    if (t->rchild != NULL)
        Delete3(bt, t->rchild);
    else {
        bt->key = t->key;
        p = t;
        t = t->lchild;
        free(p);
    }
}

【4】选做:使用代码实现DeleteBST(T, key)

技术分享图片

删除了key为20的数。

 

二叉排序树

原文:https://www.cnblogs.com/huangdong521/p/12731951.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!