Advertisement
Josif_tepe

Untitled

Nov 19th, 2024
42
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.17 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4. #include <cmath>
  5. using namespace std;
  6. struct PatriciaTrieNode {
  7.     int number, data;
  8.     PatriciaTrieNode *left_child, *right_child;
  9.    
  10.     PatriciaTrieNode() {
  11.         left_child = NULL;
  12.         right_child = NULL;
  13.     }
  14. };
  15. struct PatriciaTrie {
  16.     PatriciaTrieNode *root;
  17.     const int max_bits = 10;
  18.    
  19.    
  20.     PatriciaTrie() {
  21.         root = NULL;
  22.     }
  23.     void clear_trie() {
  24.         root = NULL;
  25.     }
  26.     bool is_empty() {
  27.         if(root == NULL) {
  28.             return true;
  29.         }
  30.         return false;
  31.     }
  32.    
  33.     bool bit(int k, int i) {
  34.         string to_binary = "";
  35.         for(int j = k; j > 0; j /= 2) {
  36.             int modulo = j % 2;
  37.             to_binary += (modulo + '0');
  38.         }
  39.        
  40.         while(to_binary.size() != max_bits) {
  41.             to_binary += "0";
  42.         }
  43.         reverse(to_binary.begin(), to_binary.end());
  44.        
  45.         return (to_binary[i - 1] == '1');
  46.     }
  47.     PatriciaTrieNode * search_node(PatriciaTrieNode * node, int k) {
  48.         PatriciaTrieNode * current_node, * next_node;
  49.        
  50.         if(node == NULL) {
  51.             return NULL;
  52.         }
  53.        
  54.         next_node = node->left_child;
  55.         current_node = node;
  56.        
  57.         while(next_node->number > current_node->number) {
  58.             current_node = next_node;
  59.            
  60.             if(bit(k, next_node->number)) {
  61.                 next_node = next_node->right_child;
  62.             }
  63.             else {
  64.                 next_node = next_node->left_child;
  65.             }
  66.         }
  67.         return next_node;
  68.     }
  69.  
  70.     bool search(int k) {
  71.         int tmp = (int) (log(k) / log(2));
  72.         if(tmp > max_bits) {
  73.             cout << "Trie is full!" << endl;
  74.             return false;
  75.         }
  76.         PatriciaTrieNode * tmp_node = search_node(root, k);
  77.        
  78.         return (tmp_node->data == k);
  79.     }
  80.    
  81.     PatriciaTrieNode * insert_node(PatriciaTrieNode * node, int value) {
  82.         PatriciaTrieNode * current_node = NULL;
  83.         PatriciaTrieNode * parent, * last_node, * new_node;
  84.        
  85.         if(node == NULL) {
  86.             node = new PatriciaTrieNode();
  87.             node->number = 0;
  88.             node->data = value;
  89.             node->left_child = node;
  90.             node->right_child = NULL;
  91.            
  92.             return node;
  93.         }
  94.         last_node = search_node(node, value);
  95.         if(value == last_node->data) {
  96.             cout << "This key already exists" << endl;
  97.             return node;
  98.         }
  99.         int i;
  100.         for(i = 1; bit(value, i) == bit(last_node->data, i); i++) {
  101.             current_node = root->left_child;
  102.         }
  103.         parent = node;
  104.  
  105.         while(current_node->number > parent->number and current_node->number < i) {
  106.             parent = current_node;
  107.            
  108.             if(bit(value, current_node->number)) {
  109.                 current_node = current_node->right_child;
  110.             }
  111.             else {
  112.                 current_node = current_node->left_child;
  113.             }
  114.         }
  115.         new_node = new PatriciaTrieNode();
  116.         new_node->number = i;
  117.         new_node->data = value;
  118.        
  119.         if(bit(value, i)) {
  120.             new_node->left_child = current_node;
  121.             new_node->right_child = new_node;
  122.         }
  123.         else {
  124.             new_node->left_child = new_node;
  125.             new_node->right_child = current_node;
  126.         }
  127.        
  128.         if(current_node == parent->left_child) {
  129.             parent->left_child = new_node;
  130.         }
  131.         else {
  132.             parent->right_child = new_node;
  133.         }
  134.        
  135.         return node;
  136.        
  137.        
  138.     }
  139.     void insert(int value) {
  140.         int tmp = (int) (log(value) / log(2)) + 1;
  141.        
  142.         if(tmp > max_bits) {
  143.             cout << "Trie is full!" << endl;
  144.             return;
  145.         }
  146.         root = insert_node(root, value);
  147.     }
  148. };
  149.  
  150. int main() {
  151.    
  152.     PatriciaTrie *trie = new PatriciaTrie();
  153.     trie->insert(3);
  154.     trie->insert(5);
  155.     trie->insert(10);
  156.     trie->insert(15);
  157.    
  158.     cout << trie-> search(6) << endl;
  159.    
  160.    
  161.    
  162.     return 0;
  163. }
  164.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement