二叉搜索树的插入、删除、查找

#include <iostream>
#include <stack>
#include <queue>

using namespace std;

class Node {
    friend class BinarySearchTree;
    int data;
    Node *leftChild;
    Node *rightChild;
public:
    explicit Node(int _data=0,Node*_leftChild=nullptr,Node*_rightChild=nullptr):data(_data),leftChild(_leftChild),rightChild(_rightChild){}

    int ShowData() const{
        return data;
    }
};

class BinarySearchTree {
    Node *root;
    stack<Node*>stack;
    queue<Node*>queue;
public:
    explicit BinarySearchTree(Node*_root= nullptr):root(_root){}

    bool InsertData(int data){
        if (!root)
            root=new Node(data);
        else{
            Node*p=root,*pre=nullptr;
            while (p){
                if (p->data==data)
                    return false;
                else if (p->data>data){
                    pre=p;
                    p=p->leftChild;
                } else{
                    pre=p;
                    p=p->rightChild;
                }
            }
            if (pre->data>data)
                pre->leftChild=new Node(data);
            else
                pre->rightChild=new Node(data);
        }
        return true;
    }

    Node* FindData(int data){
        Node*p=root;
        while (p){
            if (p->data==data)
                return p;
            else if (p->data>data)
                p=p->leftChild;
            else
                p=p->rightChild;
        }
        return nullptr;
    }

    bool DeleteData(int data){
        Node*p=root,*pre=nullptr;
        while (p){
            if (p->data==data){
                if (p->leftChild&&p->rightChild){
                    p=p->rightChild;
                    Node*q=nullptr;
                    while (p->leftChild){
                        q=p;
                        p=p->leftChild;
                    }
                    if (pre->data>data)
                        pre->leftChild->data=p->data;
                    else
                        pre->rightChild->data=p->data;
                    if (q->data>data)
                        q->leftChild=p->rightChild;
                    else
                        q->rightChild=p->rightChild;
                } else if (p->leftChild){
                    if (pre->data>data)
                        pre->leftChild=p->leftChild;
                    else
                        pre->rightChild=p->leftChild;
                } else if (p->rightChild){
                    if (pre->data>data)
                        pre->leftChild=p->rightChild;
                    else
                        pre->rightChild=p->rightChild;
                } else{
                    if (pre->data>data)
                        pre->leftChild= nullptr;
                    else
                        pre->rightChild= nullptr;
                }
                return true;
            } else if (p->data>data){
                pre=p;
                p=p->leftChild;
            } else{
                pre=p;
                p=p->rightChild;
            }
        }
        return false;
    }

    void BreadthFirstSearch(){
        Node*mark=new Node();
        int cnt=0;
        while (!queue.empty())
            queue.pop();
        queue.push(mark);
        queue.push(root);
        while (queue.front()!=queue.back()){
            if (queue.front()==mark){
                queue.push(mark);
                queue.pop();
                cnt++;
            } else{
                cout<<queue.front()->data<<' ';
                if (queue.front()->leftChild)
                    queue.push(queue.front()->leftChild);
                if (queue.front()->rightChild)
                    queue.push(queue.front()->rightChild);
                queue.pop();
            }
        }
        cout<<endl<<cnt<<" layers"<<endl;
    }

    void PreSearch(){
        Node*p=root;
        while (!stack.empty()||p){
            if (p){
                stack.push(p);
                cout<<p->data<<' ';
                p=p->leftChild;
            } else {
                p=stack.top()->rightChild;
                stack.pop();
            }
        }
    }
};

int main() {
    auto* binarySearchTree=new BinarySearchTree();
    binarySearchTree->InsertData(400);
    binarySearchTree->InsertData(122);
    binarySearchTree->InsertData(99);
    binarySearchTree->InsertData(110);
    binarySearchTree->InsertData(105);
    binarySearchTree->InsertData(250);
    binarySearchTree->InsertData(200);
    binarySearchTree->InsertData(300);
    binarySearchTree->InsertData(330);
    binarySearchTree->InsertData(450);
    binarySearchTree->InsertData(500);
    binarySearchTree->BreadthFirstSearch();
    if (binarySearchTree->FindData(500))
        cout<<binarySearchTree->FindData(500)->ShowData();
    cout<<endl;
    binarySearchTree->DeleteData(122);
    binarySearchTree->BreadthFirstSearch();
    binarySearchTree->PreSearch();
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值