Splay BUG版 = =

  1 struct splay_node {
  2     splay_node *left, *right;
  3     int value;
  4 };
  5 int size;
  6 
  7 splay_node* splay(splay_node* a, int v) {
  8     splay_node b, *l, *r, *y;
  9     if(a == NULL) return a;
 10     b.left = b.right = NULL;
 11     l = r = &b;
 12     while(1) {
 13         if(v < a->value) {
 14             if(a->left == NULL) {
 15                 break;
 16             }
 17             if(v < a->left->value) {
 18                 y = a->left;
 19                 a->left = y->right;
 20                 y->right = a;
 21                 a = y;
 22                 if(a->left == NULL) {
 23                     break;
 24                 }
 25             }
 26             r->left = a;
 27             r = a;
 28             a = a->left;
 29         } else if(v > a->value) {
 30             if(a->right == NULL) {
 31                 break;
 32             }
 33             if(v > a->right->value) {
 34                 y = a->right;
 35                 a->right = y->left;
 36                 y->left = a;
 37                 a = y;
 38                 if(a->right == NULL) {
 39                     break;
 40                 }
 41             }
 42             l->right = a;
 43             l = a;
 44             a = a->right;
 45         } else {
 46             break;
 47         }
 48     }
 49     l->right = a->left;
 50     r->left = a->right;
 51     a->left = b.right;
 52     a->right = b.left;
 53     return a;
 54 }
 55 
 56 splay_node* splay_insert(splay_node* a, int v) {
 57     splay_node *node = new splay_node;
 58     node->value = v;
 59     if(a == NULL) {
 60         node->left = node->right = NULL;
 61         size = 1;
 62         return node;
 63     }
 64     a = splay(a, v);
 65     if(v < a->value) {
 66         node->left = a->left;
 67         node->right = a;
 68         a->left = NULL;
 69         size++;
 70         return node;
 71     } else if(v > a->value) {
 72         node->right = a->right;
 73         node->left = a;
 74         a->right = NULL;
 75         size++;
 76         return node;
 77     } else {
 78         delete node;
 79         return a;
 80     }
 81 }
 82 
 83 splay_node* splay_getmin(splay_node* a) {
 84     while(a->left) {
 85         a = a->left;
 86     }
 87     return a;
 88 }
 89 
 90 splay_node* splay_getmax(splay_node* a) {
 91     while(a->right) {
 92         a = a->right;
 93     }
 94     return a;
 95 }
 96 
 97 splay_node* splay_delete(splay_node* a, int v) {
 98     splay_node* x;
 99     if(a == NULL) {
100         return NULL;
101     }
102     a = splay(a, v);
103     if(v == a->value) {
104         if(a->left == NULL) {
105             x = a->right;
106         } else {
107             x = splay(a->left, v);
108             x->right = a->right;
109         }
110         size--;
111         delete a;
112         return x;
113     }
114     return a;
115 }

 

posted @ 2015-08-21 11:18  Mite  阅读(129)  评论(0)    收藏  举报