• 二分搜索树


    二分搜索树结构性质,比根节点大的放到右子树,小的放到左子树,相等的去替换,依次递归,时间复杂度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;
            }
        }
    };
  • 相关阅读:
    day16_包(Package)丶API丶JavaBean
    day12_类中成员之方法
    day18_面向对象的三大特征之多态
    day14_面向对象的三大特征之继承
    react记录
    如何使用Houdini进行程序化优化?
    程序员健康指南
    uniapp 自定义导航
    uniapp :uviewui
    markdown
  • 原文地址:https://www.cnblogs.com/Erick-L/p/12602868.html
Copyright © 2020-2023  润新知