CCCPaste

Untitled

#include 
#include 
#include 
#include 
using namespace std;
struct PatriciaTrieNode {
    int number, data;
    PatriciaTrieNode *left_child, *right_child;
    
    PatriciaTrieNode() {
        left_child = NULL;
        right_child = NULL;
    }
};
struct PatriciaTrie {
    PatriciaTrieNode *root;
    const int max_bits = 10;
    
    
    PatriciaTrie() {
        root = NULL;
    }
    void clear_trie() {
        root = NULL;
    }
    bool is_empty() {
        if(root == NULL) {
            return true;
        }
        return false;
    }
    
    bool bit(int k, int i) {
        string to_binary = "";
        for(int j = k; j > 0; j /= 2) {
            int modulo = j % 2;
            to_binary += (modulo + '0');
        }
        
        while(to_binary.size() != max_bits) {
            to_binary += "0";
        }
        reverse(to_binary.begin(), to_binary.end());
        
        return (to_binary[i - 1] == '1');
    }
    PatriciaTrieNode * search_node(PatriciaTrieNode * node, int k) {
        PatriciaTrieNode * current_node, * next_node;
        
        if(node == NULL) {
            return NULL;
        }
        
        next_node = node->left_child;
        current_node = node;
        
        while(next_node->number > current_node->number) {
            current_node = next_node;
            
            if(bit(k, next_node->number)) {
                next_node = next_node->right_child;
            }
            else {
                next_node = next_node->left_child;
            }
        }
        return next_node;
    }

    bool search(int k) {
        int tmp = (int) (log(k) / log(2));
        if(tmp > max_bits) {
            cout << "Trie is full!" << endl;
            return false;
        }
        PatriciaTrieNode * tmp_node = search_node(root, k);
        
        return (tmp_node->data == k);
    }
    
    PatriciaTrieNode * insert_node(PatriciaTrieNode * node, int value) {
        PatriciaTrieNode * current_node = NULL;
        PatriciaTrieNode * parent, * last_node, * new_node;
        
        if(node == NULL) {
            node = new PatriciaTrieNode();
            node->number = 0;
            node->data = value;
            node->left_child = node;
            node->right_child = NULL;
            
            return node;
        }
        last_node = search_node(node, value);
        if(value == last_node->data) {
            cout << "This key already exists" << endl;
            return node;
        }
        int i;
        for(i = 1; bit(value, i) == bit(last_node->data, i); i++) {
            current_node = root->left_child;
        }
        parent = node;

        while(current_node->number > parent->number and current_node->number < i) {
            parent = current_node;
            
            if(bit(value, current_node->number)) {
                current_node = current_node->right_child;
            }
            else {
                current_node = current_node->left_child;
            }
        }
        new_node = new PatriciaTrieNode();
        new_node->number = i;
        new_node->data = value;
        
        if(bit(value, i)) {
            new_node->left_child = current_node;
            new_node->right_child = new_node;
        }
        else {
            new_node->left_child = new_node;
            new_node->right_child = current_node;
        }
        
        if(current_node == parent->left_child) {
            parent->left_child = new_node;
        }
        else {
            parent->right_child = new_node;
        }
        
        return node;
        
        
    }
    void insert(int value) {
        int tmp = (int) (log(value) / log(2)) + 1;
        
        if(tmp > max_bits) {
            cout << "Trie is full!" << endl;
            return;
        }
        root = insert_node(root, value);
    }
};

int main() {
    
    PatriciaTrie *trie = new PatriciaTrie();
    trie->insert(3);
    trie->insert(5);
    trie->insert(10);
    trie->insert(15);
    
    cout << trie-> search(6) << endl;
    
    
    
    return 0;
}