Advertisement
Guest User

Untitled

a guest
Jan 16th, 2018
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.11 KB | None | 0 0
  1. struct Node
  2. {
  3.     int key;
  4.     int bit;
  5.     Node *next[2];
  6.     Node() { }
  7. };
  8.  
  9. class PATRICIA
  10. {
  11. public:
  12.     Node *root;
  13.     PATRICIA()
  14.     {
  15.         root = new Node();
  16.         root->key = 0;
  17.         root->bit = 0;
  18.         root->next[0] = root->next[1] = root;
  19.     }
  20.     int bit(int x, int i)
  21.     {
  22.         return (x >> i) & 1;
  23.     }
  24.     Node *Search(int v)
  25.     {
  26.         Node *p = root;
  27.         Node *pp = NULL;
  28.         do
  29.         {
  30.             pp = p;
  31.             p = p->next[bit(v, p->bit)];
  32.         } while (pp->bit > p->bit);
  33.         return p;
  34.     }
  35.     void Insert(int v)
  36.     {
  37.         Node *q = Search(v);
  38.         if (q->key == v) return;
  39.         int b = MAX;
  40.         for (; bit(v, b) == bit(q->key, b); b--);
  41.  
  42.         Node *p = root;
  43.         Node *pp = NULL;
  44.         do
  45.         {
  46.             pp = p;
  47.             p = p->next[bit(v, p->bit)];
  48.         } while (pp->bit > p->bit && p->bit > b);
  49.  
  50.         q = new Node();
  51.         q->key = v;
  52.         q->bit = b;
  53.         q->next[bit(v, b)] = q;
  54.         q->next[1 - bit(v, b)] = p;
  55.         pp->next[bit(v, pp->bit)] = q;
  56.     }
  57.     void PrintRec(Node *p)
  58.     {
  59.         if(p)
  60.         {
  61.             if (p->next[0]->bit < p->bit) PrintRec(p->next[0]);
  62.             cout << p->key << " ";
  63.             if (p->next[1]->bit < p->bit) PrintRec(p->next[1]);
  64.         }
  65.     }
  66.     void Print()
  67.     {
  68.         PrintRec(root);
  69.         cout << endl;
  70.     }
  71. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement