Advertisement
keverman

Trie

Feb 7th, 2020
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.59 KB | None | 0 0
  1. struct trie_node
  2. {
  3.     bool is_end; map<char, trie_node*> nodes;
  4.     trie_node() { is_end = false; }
  5. };
  6.  
  7. struct trie
  8. {
  9.     trie_node* root;
  10.  
  11.     trie()
  12.         : root(new trie_node()) {}
  13.  
  14.     void insert(string key)
  15.     {
  16.         trie_node* node = root;
  17.         for (char c : key)
  18.         {
  19.             if (node->nodes.find(c) == node->nodes.end())
  20.                 node->nodes[c] = new trie_node();
  21.             node = node->nodes[c];
  22.         }
  23.         node->is_end = true;
  24.     }
  25.  
  26.     bool search(string key)
  27.     {
  28.         trie_node* node = root;
  29.         for (char c : key)
  30.         {
  31.             if (node->nodes.find(c) == node->nodes.end())
  32.                 return false;
  33.             node = node->nodes[c];
  34.         }
  35.         return node->is_end;
  36.     }
  37.  
  38.     // Removes the leaf if it is dead, i.e. it has no subnodes and is not a word end
  39.     bool remove_leaf(trie_node* node)
  40.     {
  41.         if (!node->is_end && node->nodes.empty())
  42.         {
  43.             delete node;
  44.             return true;
  45.         }
  46.         return false;
  47.     }
  48.  
  49.     bool remove_rec(trie_node* node, string& key, int depth)
  50.     {
  51.         if (depth == key.size())
  52.         {
  53.             node->is_end = false;
  54.             return remove_leaf(node);
  55.         }
  56.  
  57.         auto search = node->nodes.find(key[depth]);
  58.         if (search == node->nodes.end() ||
  59.             !remove_rec(search->second, key, depth + 1))
  60.             return false;
  61.  
  62.         node->nodes.erase(search);
  63.         return remove_leaf(node);
  64.     }
  65.  
  66.     inline void remove(string key)
  67.     {
  68.         remove_rec(root, key, 0);
  69.     }
  70. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement