二分搜索树

二分搜索树结构性质,比根节点大的放到右子树,小的放到左子树,相等的去替换,依次递归,时间复杂度O^log(n)级别

当数据为有序时,时间复杂度会退化成O^n

为避免有序数据的出现 -->平衡二叉树:红黑树

template<typename Key,typename Value>
class BST{
private:
    struct Node{
       Key key;
       Value value;
       Node *left;
       Node *right;

       Node(Key key,Value value){
           this->key = key;
           this->value = value;
           this->left = this->right = NULL;
       }
       Node(Node *node){
           this->key = node->key;
           this->value = node->value;
           this->left = node->left;
           this->right = node->right;
       }
    };
    Node *root;
    int count;

public:
    BST(){
        root=NULL;
        count=0;
    }
    ~BST(){
        destroy(root);
    }
    int size(){
        return count;
    }
    bool isEmpty(){
        return count==0;
    }
    void insert(Key key,Value value){
        root = insert(root,key,value)
    }

    bool contain(Key key){
        return contain(root,key);
    }
    Value* search(Key key){
        return search(root,key);
    }
    //前序遍历
    void preOrder(){
        preOrder(root);
    }

    //中序遍历
    void inOrder(){
        inOrder(root);
    }

    //后序遍历
    void postOrder(){
        postOrder(root);
    }

    //层序遍历
    void levelOrder(){
        queue<Node*> q;
        q.push(root);
        while (!q.empty())
        {
            Node *node = q.front();
            q.pop();
            count<<node->key<<endl;
            if(node->left)
                q.push(node->left);
            if(node->right)
                q.push(node->right);
        }
        
    }
    //寻找最小键值
    Key minimum(){
        assert(count !=0);
        Node* minNode = minimum(root);
        return minNode->key; 
    }
    //寻找最大键值
    Key maximum(){
        assert(count !=0);
        Node* maxNode = maximum(root);
        return maxNode->key; 
    }

    void removeMin(){
        if(root)
            root = removeMin(root);
    }
    void removeMax(){
        if(root)
            root = removeMax(root);
    }
    void remove(Key key){
        root = remove(root,key)
    }

private:
    //向以node为根的二叉搜索树中,插入节点(key,value)
    //返回插入新节点后的二叉搜索树的根
    Node* insert(Node *node,Key key,Value value){
        if(node==NULL){
            count ++;
            return new Node(key,value);
        }
        if(key==node->key)
            node->value = value;
        else if(key <node->key)
            node->left = insert(node->left,key,value);
        else
            node->right = insert(node->right,key,value)
        return node;
    }

    //查看以node为根的二叉搜索树中是否包含键值为key的节点
    bool contain(Node* node,Key key){
        if(node == NULL)
            return false;
        if(key== node->key){
            return true;
        }
        else if(key < node->key)
        {
            return contain(node->left,key);
        }else
        {
            return contain(node->right,key);
        }
    }
    Value* search(Node* node,Key key){
        if(node == NULL)
            return NULL;
        if(key == node->key)
            return &(node->value);
        else if(key < node->key)
            return search(node->left,key)
        else
            return search(node->right,key);
    }
    void preOrder(Node* node){
        if(node!=NULL){
            count<<node->key<<endl;
            preOrder(node->left);
            preOrder(node->right);
        }
    }
    void inOrder(Node* node){
        if(node !=NULL){
            inOrder(node->left);
            count<<node->key<<endl;
            inOrder(node->right);
        }
    }

    void postOrder(Node* node){
        if(node !=NULL){
            postOrder(node->left);
            postOrder(node->right);
            count<<node->key<<endl;
        }
    }
    //释放空间
    void destroy(Node* node){
        if(node !=NULL){
            destroy(node->left);
            destroy(node->right);

            delete node;
            count --;
        }
    }
    //查找最小值
    Node* minimum(Node* node){
        if(node->left==NULL)
            return node;

        return minimum(node->left);
    }
    //查找最大值
    Node* maximum(Node* node){
        if(node->right==NULL)
            return node;

        return maximum(node->right);
    }
    Node* removeMin(Node* node){
        if(node->left ==NULL){
            Node* rightNode = node->right;
            delete node;
            count --;
            return rightNode;
        }
        node->left = removeMin(node->left);
        return node;
    }
    Node* removeMax(Node* node){
        if(node->left ==NULL){
            Node* leftNode = node->left;
            delete node;
            count --;
            return leftNode;
        }
        node->right = removeMax(node->right);
        return node;
    }
    Node* remove(Node* node,Key key){
        if(node == NULL)
            return NULL;
        if(key<node->key){
            node->left = remove(node->left,key);
            return node;
        }
        else if(key > node->key){
            node->right=remove(node->right,key)
            return node;
        }else{
            if(node->left ==NULL){
                Node *rightNode = node->right;
                delete node;
                count --;
                return rightNode;
            }
            if(node->right ==NULL){
                Node *leftNode = node->left;
                delete node;
                count --;
                return leftNode;
            }

            Node *successor = new Node(minimum(node->right));
            count ++;
            successor->right = removeMin(node->right);
            successor->left = node->left;

            delete Node;
            count --;

            return successor;
        }
    }
};
原文地址:https://www.cnblogs.com/Erick-L/p/12602868.html