二叉排序树的实现

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

SearchBST(T,key)

伪代码:

    if (T为空 || T的值等于key)返回T
    if (T的值 > key)Search(T->lchid, key)
    if (T的值 < key)Search(T->rchid, key)

代码:

void Search(BiTree T, char key) {
    if (T == NULL || T->data == key)return;
    if (T->data > key)Search(T->lchild, key);
    if (T->data < key)Search(T->rchild, key);

}

InsertBST(T, key)

伪代码:

    if (T为空) {
        建立新节点
            新节点的值为key
        }
    if (T == key)返回T
        if (T->data > key)InsertBST(T->lchild,key)
            if (T->data < key)InsertBST(T->rchild,key)

代码:

int InsertBST(BiTree& T, char key) {
    if (T == NULL) {
        T = new BiTNode;
        T->data = key;
        T->lchild == NULL;
        T->rchild == NULL;
        return 1;
    }
    if (T->data == key)return 0;
    if (T->data > key)return InsertBST(T->lchild, key);
    if (T->data < key)return InsertBST(T->rchild, key);
}

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

CreateBST(T)

伪代码:

    初始化树T
    while (i < n) {
        使用插入节点的函数InsertBST进行创建
        i++
    }
    返回T

代码:

BiTNode *CreatBST(int a[], int n) {
    BiTNode *T = NULL;
    int i = 0;
    while (i < n) {
        InsertBST(T, a[i]);
        i++;
        }
    return T;
}

创建树并中序输出

3. 编写DeleteBST(T, key)的伪代码实现从T中删除关键字key。

DeleteBST(bt,k)

伪代码:

    if(bt为空)返回0
    else {
        if(k<bt->data)返回递归DeleteBST(bt->lchild,k)
        else if(k>bt->data)返回递归DeleteBST(bt->rchild,k)
        else {
            引用函数Delete(bt)来删除关键字为k的节点
            返回1
        }
    }

代码:

int DeleteBST(BiTNode*& bt, char k) {
    if (bt == NULL)return 0;
    else {
        if (k < bt->data)return DeleteBST(bt->lchild, k);
        else if (k > bt->data)return DeleteBST(bt->rchild, k);
        else {
            Delete(bt);
            return 1;
        }
    }
}

Delete(p)

伪代码:

    创建一个节点q
    if (p的右孩子为空) {
        q = p;
        p=p的左孩子//让被删除节点的左孩子放到被删除节点上
        删除节点q
    }
    else if (p的左孩子为空) {
        q = p;
        p = p的右孩子//让被删除节点的右孩子放到被删除节点上
        删除节点q
    }
    当p节点的左右孩子都存在时引用Delete1函数

代码:

void Delete(BiTNode*& p) {
    BiTNode* q;
    if (p->rchild == NULL) {
        q = p;
        p = p->lchild;
        free(q);
    }
    else if (p->lchild == NULL) {
        q = p;
        p = p->rchild;
        free(q);
    }
    else Delete1(p, p->lchild);
}

Delete1(p,r)

伪代码:

    创建节点q
    if(删除节点的左子树的右子树不为空)递归Delete1找到被删除节点的左子树            的最右下节点
    else {
        将最右下节点的值赋给被删除节点
        再将最右下节点放在被删节点上
        删除节点q
    }

代码:

void Delete1(BiTNode* p, BiTNode*& r) {
    BiTNode* q;
    if (r->rchild != NULL) {
        Delete1(p, r->rchild);
    }
    else {
        p->data = r->data;
        q = r;
        r = r->lchild;
        free(q);
    }
}
posted @ 2020-04-19 13:23  hhs(黄鸿森)  阅读(225)  评论(0编辑  收藏  举报