伸展树

来源:互联网 发布:如何申请做淘宝主播 编辑:程序博客网 时间:2024/05/17 00:59
  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             //left101             lr = 0;102         }103         else104         {105             //right106             lr = 1;107         }108     }109     //root return110     if(nPa == NULL)111     {112         return;113     }114     else if(nPaPa == NULL && n == nPa->left)115     {116         //zig117         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         //zag128         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-zig139         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-zag166         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-zag193         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-zig219         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     else255         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 1267     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 2274     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>

 

原创粉丝点击