1. 程式人生 > 實用技巧 >vuex的模組化

vuex的模組化

#include <iostream>
#include <queue>
#include <cassert>

using namespace std;

// 二分搜尋樹
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; } // 向二分搜尋樹中插入一個新的(key, value)資料對 void insert(Key key, Value value){ //root = insert(root, key, value); insert_non-recursive (root, key, value) } // 檢視二分搜尋樹中是否存在鍵key bool contain(Key key){ return contain(root, key); } // 在二分搜尋樹中搜索鍵key所對應的值。如果這個值不存在, 則返回NULL 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(); cout<<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 ); } // 從二分搜尋樹中刪除鍵值為key的節點 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 // key > node->key node->right = insert( node->right, key, value); return node; } void insert_non-recursive (Node *node, Key key, Value value){ if( node == NULL ){ count ++; node = new Node(key, value); } Node *x = node; Node *y = NULL; while(x != NULL){ y = x; if(key == x->key){ x->value = value; return; }else if(key < x->key){ x = x->left; }else{ x = x->right; } } if(y){ if(key < y->key ) y->left = new Node(key, value); else y->right = new Node(key, value); } return; } // 檢視以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 // key > node->key return contain( node->right , key ); } // 在以node為根的二分搜尋樹中查詢key所對應的value, 遞迴演算法 // 若value不存在, 則返回NULL 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 // key > node->key return search( node->right, key ); } // 對以node為根的二分搜尋樹進行前序遍歷, 遞迴演算法 void preOrder(Node* node){ if( node != NULL ){ cout<<node->key<<endl; preOrder(node->left); preOrder(node->right); } } // 對以node為根的二分搜尋樹進行中序遍歷, 遞迴演算法 void inOrder(Node* node){ if( node != NULL ){ inOrder(node->left); cout<<node->key<<endl; inOrder(node->right); } } // 對以node為根的二分搜尋樹進行後序遍歷, 遞迴演算法 void postOrder(Node* node){ if( node != NULL ){ postOrder(node->left); postOrder(node->right); cout<<node->key<<endl; } } // 釋放以node為根的二分搜尋樹的所有節點 // 採用後續遍歷的遞迴演算法 void destroy(Node* node){ if( node != NULL ){ destroy( node->left ); destroy( node->right ); delete node; count --; } } // 返回以node為根的二分搜尋樹的最小鍵值所在的節點, 遞迴演算法 Node* minimum(Node* node){ if( node->left == NULL ) return node; return minimum(node->left); } // 返回以node為根的二分搜尋樹的最大鍵值所在的節點, 遞迴演算法 Node* maximum(Node* node){ if( node->right == NULL ) return node; return maximum(node->right); } // 刪除掉以node為根的二分搜尋樹中的最小節點, 遞迴演算法 // 返回刪除節點後新的二分搜尋樹的根 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為根的二分搜尋樹中的最大節點, 遞迴演算法 // 返回刪除節點後新的二分搜尋樹的根 Node* removeMax(Node* node){ if( node->right == NULL ){ Node* leftNode = node->left; delete node; count --; return leftNode; } node->right = removeMax(node->right); return node; } // 刪除掉以node為根的二分搜尋樹中鍵值為key的節點, 遞迴演算法 // 返回刪除節點後新的二分搜尋樹的根 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{ // key == node->key // 待刪除節點左子樹為空的情況 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; } } }; void shuffle( int arr[], int n ){ srand( time(NULL) ); for( int i = n-1 ; i >= 0 ; i -- ){ int x = rand()%(i+1); swap( arr[i] , arr[x] ); } } // 測試 remove int main() { srand(time(NULL)); BST<int,int> bst = BST<int,int>(); // 取n個取值範圍在[0...n)的隨機整數放進二分搜尋樹中 int n = 10000; for( int i = 0 ; i < n ; i ++ ){ int key = rand()%n; // 為了後續測試方便,這裡value值取和key值一樣 int value = key; bst.insert(key,value); } // 注意, 由於隨機生成的資料有重複, 所以bst中的資料數量大概率是小於n的 // order陣列中存放[0...n)的所有元素 int order[n]; for( int i = 0 ; i < n ; i ++ ) order[i] = i; // 打亂order陣列的順序 shuffle( order , n ); // 亂序刪除[0...n)範圍裡的所有元素 for( int i = 0 ; i < n ; i ++ ) if( bst.contain( order[i] )){ bst.remove( order[i] ); cout<<"After remove "<<order[i]<<" size = "<<bst.size()<<endl; } // 最終整個二分搜尋樹應該為空 cout << bst.size() << endl; return 0; }