92 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include<stdio.h>
 | |
| #include<stdlib.h>
 | |
| 
 | |
| typedef struct TreeNode {
 | |
|     int d;
 | |
|     struct TreeNode *l, *r;
 | |
| } T;
 | |
| 
 | |
| T *c(int d) {
 | |
|     T *n = malloc(sizeof(T));
 | |
|     n->d = d;
 | |
|     n->l = n->r = NULL;
 | |
|     return n;
 | |
| }
 | |
| 
 | |
| T *i(T *r, int d) {
 | |
|     if (!r) return c(d);
 | |
|     if (d < r->d) r->l = i(r->l, d);
 | |
|     else if (d > r->d) r->r = i(r->r, d);
 | |
|     return r;
 | |
| }
 | |
| 
 | |
| T *f(T *r) {
 | |
|     while (r->l) r = r->l;
 | |
|     return r;
 | |
| }
 | |
| 
 | |
| T *d(T *r, int k) {
 | |
|     if (!r) return NULL;
 | |
|     if (k < r->d) r->l = d(r->l, k);
 | |
|     else if (k > r->d) r->r = d(r->r, k);
 | |
|     else {
 | |
|         if (!r->l) {
 | |
|             T *t = r->r;
 | |
|             free(r);
 | |
|             return t;
 | |
|         } else if (!r->r) {
 | |
|             T *t = r->l;
 | |
|             free(r);
 | |
|             return t;
 | |
|         }
 | |
|         T *t = f(r->r);
 | |
|         r->d = t->d;
 | |
|         r->r = d(r->r, t->d);
 | |
|     }
 | |
|     return r;
 | |
| }
 | |
| 
 | |
| void t(T *r) {
 | |
|     if (r) {
 | |
|         t(r->l);
 | |
|         printf("%d ", r->d);
 | |
|         t(r->r);
 | |
|     }
 | |
| }
 | |
| 
 | |
| int s(T *r, int k, int *p) {
 | |
|     if (!r) return 0;
 | |
|     int l = s(r->l, k, p);
 | |
|     if (l) return l;
 | |
|     if (++*p == k) return *p;
 | |
|     return s(r->r, k, p);
 | |
| }
 | |
| 
 | |
| int main() {
 | |
|     T *r = NULL;
 | |
|     int c, v;
 | |
|     while (1) {
 | |
|         printf("\n1. Insert\n2. Delete\n3. Search\n4. Display\n5. Exit\n");
 | |
|         scanf("%d", &c);
 | |
|         if (c == 1) {
 | |
|             scanf("%d", &v);
 | |
|             r = i(r, v);
 | |
|         } else if (c == 2) {
 | |
|             scanf("%d", &v);
 | |
|             r = d(r, v);
 | |
|         } else if (c == 3) {
 | |
|             scanf("%d", &v);
 | |
|             int p = 0, f = s(r, v, &p);
 | |
|             printf(f ? "Found at %d\n" : "Not found\n", f);
 | |
|         } else if (c == 4) {
 | |
|             t(r);
 | |
|             printf("\n");
 | |
|         } else if (c == 5) {
 | |
|             break;
 | |
|         } else {
 | |
|             printf("Invalid\n");
 | |
|         }
 | |
|     }
 | |
|     free(r);
 | |
|     return 0;
 | |
| }
 | 
