伸展树

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 //author : pgdnxu@qq.com
  4 
  5 struct NODE
  6 {
  7     NODE *left;
  8     NODE *right;
  9     NODE *pa;
 10     int data;
 11 };
 12 
 13 struct BST
 14 {
 15     NODE *root;
 16     int nodenum;
 17 };
 18 
 19 NODE *search(int data,NODE *n)
 20 {
 21     if(NULL == n)
 22         return NULL;
 23     if(data < n->data)
 24         return search(data,n->left);
 25     else if(data > n->data)
 26         return search(data,n->right);
 27     else
 28         return n;
 29 }
 30 NODE *find(int data,BST *t)
 31 {
 32     if(NULL == t)
 33         return NULL;
 34     return search(data,t->root);
 35 }
 36 
 37 NODE *insert(int data,NODE **n,NODE *p)
 38 {
 39     if(NULL == (*n))
 40     {
 41         (*n) = (NODE*)malloc(sizeof(NODE));
 42         (*n)->left = NULL;
 43         (*n)->right = NULL;
 44         (*n)->pa = p;
 45         (*n)->data = data;
 46         return *n;
 47     }
 48     if(data < (*n)->data)
 49     {
 50         //left
 51         return insert(data,&((*n)->left),*n);
 52     }
 53     else
 54     {
 55         return insert(data,&((*n)->right),*n);
 56     }
 57 }
 58 
 59 NODE *addNode(BST **t,int data)
 60 {
 61     if(NULL == (*t))
 62     {
 63         (*t) = (BST*)malloc(sizeof(BST));
 64         (*t)->root = NULL;
 65         (*t)->nodenum = 0;
 66     }
 67     (*t)->nodenum++;
 68     return insert(data,&((*t)->root),NULL);
 69 }
 70 void init(BST **t,int data[],int num)
 71 {
 72     int i;
 73     NODE *tmp;
 74     for(i=0;i<num;i++) {="" tmp="addNode(t,data[i]);" }="" void="" printtree(node="" *n,int="" deep)="" int="" i;="" for(i="0;i<deep;i++)" printf("="" ");="" if(null="=" n)="" printf("null\n");="" else="" if(n-="">pa == NULL)
 75         printf("%d--|\n",n->data);
 76     else
 77         printf("%d(p:%d)--|\n",n->data,n->pa->data);
 78     if(NULL != n)
 79     {
 80         printTree(n->left,deep+1);
 81         printTree(n->right,deep+1);
 82     }
 83 }
 84 
 85 void splay(NODE *n)
 86 {
 87     //error
 88     if(NULL == n)
 89         return;
 90     NODE *nPa = n->pa;
 91     NODE *nPaPa = nPa == NULL ? NULL : nPa->pa;
 92     NODE *nPaPaPa=NULL;
 93     int lr = -1;
 94     if(nPaPa != NULL)
 95         nPaPaPa = nPaPa->pa;
 96     if(nPaPaPa != NULL)
 97     {
 98         if(nPaPa == nPaPaPa->left)
 99         {
100             //left
101             lr = 0;
102         }
103         else
104         {
105             //right
106             lr = 1;
107         }
108     }
109     //root return
110     if(nPa == NULL)
111     {
112         return;
113     }
114     else if(nPaPa == NULL && n == nPa->left)
115     {
116         //zig
117         printf("proc: zig\n");
118         nPa->left = n->right;
119         if(n->right != NULL)
120             n->right->pa = nPa;
121         n->pa = nPa->pa;
122         nPa->pa = n;
123         n->right = nPa;
124     }
125     else if(nPaPa == NULL && n == nPa->right)
126     {
127         //zag
128         printf("proc: zag\n");
129         nPa->right = n->left;
130         if(n->left != NULL)
131             n->left->pa = nPa;
132         n->pa = nPa->pa;
133         nPa->pa = n;
134         n->left = nPa;
135     }
136     else if(n == nPa->left && nPa == nPaPa->left)
137     {
138         //zig-zig
139         printf("proc: zig-zig\n");
140         
141         nPaPa->left = nPa->right;
142         nPa->pa = nPaPa->pa;
143         nPaPa->pa = nPa;
144         nPa->right = nPaPa;
145 
146         nPa->left = n->right;
147         if(n->right != NULL)
148             n->right->pa = nPa;
149         n->pa = nPa->pa;
150         nPa->pa = n;
151         n->right = nPa;
152 
153         if(lr != -1)
154         {
155             if(lr == 0)
156                 nPaPaPa->left = n;
157             else if(lr == 1)
158                 nPaPaPa->right = n;
159         }
160         if(n->pa != NULL)
161             splay(n);
162     }
163     else if(n == nPa->right && nPa == nPaPa->right)
164     {
165         //zag-zag
166         printf("proc: zag-zag\n");
167         
168         nPaPa->right = nPa->left;
169         nPa->pa = nPaPa->pa;
170         nPaPa->pa = nPa;
171         nPa->left = nPaPa;
172 
173         nPa->right = n->left;
174         if(n->left != NULL)
175             n->left->pa = nPa;
176         n->pa = nPa->pa;
177         nPa->pa = n;
178         n->left = nPa;
179 
180         if(lr != -1)
181         {
182             if(lr == 0)
183                 nPaPaPa->left = n;
184             else if(lr == 1)
185                 nPaPaPa->right = n;
186         }
187         if(n->pa != NULL)
188             splay(n);
189     }
190     else if(n == nPa->left && nPa == nPaPa->right)
191     {
192         //zig-zag
193         printf("proc: zig-zag\n");
194         nPa->left = n->right;
195         n->pa = nPa->pa;
196         nPa->pa = n;
197         n->right = nPa;
198 
199         nPaPa->right = n->left;
200         if(n->left != NULL)
201             n->left->pa = nPaPa;
202         n->pa = nPaPa->pa;
203         nPaPa->pa = n;
204         n->left = nPaPa;
205 
206         if(lr != -1)
207         {
208             if(lr == 0)
209                 nPaPaPa->left = n;
210             else if(lr == 1)
211                 nPaPaPa->right = n;
212         }
213         if(n->pa != NULL)
214             splay(n);
215     }
216     else if(n == nPa->right && nPa == nPaPa->left)
217     {
218         //zag-zig
219         printf("proc: zag-zig\n");
220         nPa->right = n->left;
221         n->pa = nPa->pa;
222         nPa->pa = n;
223         n->left = nPa;
224 
225         nPaPa->left = n->right;
226         if(n->right != NULL)
227             n->right->pa = nPaPa;
228         n->pa = nPaPa->pa;
229         nPaPa->pa = n;
230         n->right = nPaPa;
231 
232         if(lr != -1)
233         {
234             if(lr == 0)
235                 nPaPaPa->left = n;
236             else if(lr == 1)
237                 nPaPaPa->right = n;
238         }
239         if(n->pa != NULL)
240             splay(n);
241     }
242 }
243 
244 NODE *sfind(int data,BST *t)
245 {
246     if(NULL == t)
247         return NULL;
248     NODE *tar = search(data,t->root);
249     if(tar != NULL)
250     {
251         splay(tar);
252         t->root = tar;
253     }
254     else
255         printf("tar is NULL!\n");
256     return tar;
257 }
258 
259 
260 int main()
261 {
262     int a[] = {6,5,4,3,2,1};    
263     BST *tree;
264     init(&tree,a,6);
265     
266     //case 1
267     printf("========= case 1 =========\n");
268     printTree(tree->root,0);
269     sfind(1,tree);
270     printf("--------------------------\n");
271     printTree(tree->root,0);
272     printf("==========================\n");
273     //case 2
274     printf("========= case 2 =========\n");
275     printTree(tree->root,0);
276     sfind(2,tree);
277     printf("--------------------------\n");
278     printTree(tree->root,0);
279     printf("==========================\n");
280     
281     return 0;
282 }
283 </num;i++)></stdlib.h></stdio.h>

 

posted @ 2013-03-07 15:32  xsc906476903  阅读(164)  评论(0编辑  收藏  举报