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


    一.编写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);
        }
    }
    

    案例

  • 相关阅读:
    LeetCode-5. Longest Palindromic Substring(M)
    Python if else简洁写法,列表推导式,三目运算符写法
    Java GC机制
    int与integer的区别
    Java内存分配机制
    HashMap原理
    哈希表算法
    哈希
    java 三大框架面试题
    Java反射机制
  • 原文地址:https://www.cnblogs.com/ssp1781554770/p/12733754.html
Copyright © 2020-2023  润新知