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);
    }
}