数据结构:二叉排序树的实现

一.编写SearchBST(T,key)与Insert(T,key)的伪代码,并实现

1.SearchBST(T,key)的伪代码及代码实现

伪代码:

BTree SearchBST(BTree T, int key) {
    if (T为空或者T->data == key)
        返回T;
    if(key<T->data)
        返回 SearchBST(T->左子树, key);
    else
        返回 SearchBST(T->右子树, key);
}

代码:

BTree SearchBST(BTree T, int key)
{
    if (T == NULL || T->data == key)
        return T;
    if (key < T->data)
        return SearchBST(T->lchild, key);
    else
        return SearchBST(T->rchild, key);
}

2.insert(T,key)的伪代码及代码实现

伪代码:

int InsertBST(BTree& T, int key) {
    if (T为空)
    {
        初始化T并为T申请一个空间;
        T->data = key;
        T->左右孩子置为空;
        返回1;
    }
    else if (T->data == key)
        返回0;
    else if (T->data > key)
        返回 InsertBST(T->左子树, key);
    else
        返回 InsertBST(T->右子树, key);
}

代码:

int InsertBST(BTree& T, int key)
{
    if (T == NULL)
    {
        T = new BTNode;
        T->data = key;
        T->lchild = T->rchild = NULL;
        return 1;
    }
    else if (T->data == key)
        return 0;
    else if (T->data > key)
        return InsertBST(T->lchild, key);
    else
        return InsertBST(T->rchild, key);
}

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

CreateBST(T)的伪代码及代码实现
伪代码:

伪代码
void CreateBST(BTree& t, int n)
{
    初始化t = NULL;
    while (n--)
    {
        输入x;
        InsertBST(t, x);
    }
}

代码:

BTree CreateBST(int n)
{
    int i = 0;
    int x;
    BTree t = NULL;
    while (n--)
    {
        cin >> x;
        InsertBST(t, x);
    }
    return t;
}

代码运行截图展示

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

int DeleteBST(BTNode*& T, int k)的伪代码

int DeleteBST(BTNode*& T, int k)
{
    if (T为空)
        返回0;
    else
    {
        if (k < T->data)
            返回 DeleteBST(T->左子树, k);
        else if (k > T->data)
            返回 DeleteBST(T->右子树, k);
        else {
            释放T;
            返回1;
        }
    }
}

void Delete(BTNode*& p)的伪代码

void Delete(BTNode*& p)
{
    初始化一个节点q;
    if (p的右子树为空)
    {
        q 暂存p节点;
        p 指向它的左子树;
        释放q;
    }
    else if (p的左子树为空)
    {
        q 暂存p节点;
        p 指向它的右子树;
        释放q;
    }
    Delete1(p, p的左子树);
}

void Delete1(BTNode* p, BTNode*& r)的伪代码

void Delete1(BTNode* p, BTNode*& r)
{
    初始化一个节点q;
    if (r的右子树不为空)
        Delete1(p, r指向右子树);
    else
    {
        p->data = r->data;
        q = r;
        r 指向它的左子树;
        释放q;
    }
}

四.使用代码实现DeleteBST(T,key)

int DeleteBST(BTNode*& T, int k)
{
    if (T == NULL)
        return 0;
    else
    {
        if (k < T->data)
            return DeleteBST(T->lchild, k);
        else if (k > T->data)
            return DeleteBST(T->rchild, k);
        else
        {
            Delete(T);
            return 1;
        }
    }
}
void Delete(BTNode*& p)
{
    BTNode* q;
    if (p->rchild == NULL)
    {
        q = p;
        p = p->lchild;
        free(q);
    }
    else if (p->lchild == NULL)
    {
        q = p;
        p = p->rchild;
        free(q);
    }
    Delete1(p,p->lchild);
}
void Delete1(BTNode* p, BTNode*& r)
{
    BTNode* q;
    if (r->rchild != NULL)
        Delete1(p, r->rchild);
    else
    {
        p->data = r->data;
        q = r;
        r = r->lchild;
        free(q);
    }
}

五.完整代码及案例

完整代码

#include<iostream>
using namespace std;
typedef struct BTnode
{
    int data;
    struct BTnode* lchild;
    struct BTnode* rchild;
}BTNode, * BTree;

BTree SearchBST(BTree T, int key);
int InsertBST(BTree& T, int key);
void CreateBST(BTree& t, int n);
void InorderPrintNodes(BTree T);
int DeleteBST(BTNode*& T, int k);
void Delete(BTNode*& T);
void Delete1(BTNode* p, BTNode*& r);

int main()
{
    int n;
    cin >> n;
    BTree T;
    CreateBST(T, n);
    cout << "中序输出: ";
    InorderPrintNodes(T);
    cout << endl << "要删除的的节点";
    int k;
    cin >> k;
    DeleteBST(T, k);
    cout << "中序输出删除后的节点: ";
    InorderPrintNodes(T);
    return 0;
}

BTree SearchBST(BTree T, int key)
{
    if (T == NULL || T->data == key)
        return T;
    if (key < T->data)
        return SearchBST(T->lchild, key);
    else
        return SearchBST(T->rchild, key);
}
int InsertBST(BTree& T, int key)
{
    if (T == NULL)
    {
        T = new BTNode;
        T->data = key;
        T->lchild = T->rchild = NULL;
        return 1;
    }
    else if (T->data == key)
        return 0;
    else if (T->data > key)
        return InsertBST(T->lchild, key);
    else
        return InsertBST(T->rchild, key);
}
void CreateBST(BTree& t, int n)
{
    int i = 0;
    int x;
    t = NULL;
    while (n--)
    {
        cin >> x;
        InsertBST(t, x);
    }
};

//中序输出
void InorderPrintNodes(BTree T)
{

    if (T)
    {
        InorderPrintNodes(T->lchild);
        cout << T->data << " ";
        InorderPrintNodes(T->rchild);
    }
}

int DeleteBST(BTNode*& T, int k)
{
    if (T == NULL)
        return 0;
    else
    {
        if (k < T->data)
            return DeleteBST(T->lchild, k);
        else if (k > T->data)
            return DeleteBST(T->rchild, k);
        else
        {
            Delete(T);
            return 1;
        }
    }
}
void Delete(BTNode*& p)
{
    BTNode* q;
    if (p->rchild == NULL)
    {
        q = p;
        p = p->lchild;
        free(q);
    }
    else if (p->lchild == NULL)
    {
        q = p;
        p = p->rchild;
        free(q);
    }
    Delete1(p,p->lchild);
}
void Delete1(BTNode* p, BTNode*& r)
{
    BTNode* q;
    if (r->rchild != NULL)
        Delete1(p, r->rchild);
    else
    {
        p->data = r->data;
        q = r;
        r = r->lchild;
        free(q);
    }
}

案例

原文地址:https://www.cnblogs.com/ssp1781554770/p/12733754.html