/* Dynamic searching tree, DST is created in searching progress. * If the element is found in the tree, TRUE will be returned * as well as the tree node.Otherwise, if element is not found * , new node will be created, it is the son node of the * returned one. * DELETE is a very important function , node was tried to be * deleted directly from the tree. the deleting progress is * also the searching progress. * by:double; version:0.1;data:2009-08-13 */ #include "/usr/c/head.h" #define MAX 100 #define INT_MAX ((int)(~0U >> 1)) #define EQ(a, b) ((a) == (b)) #define LT(a, b) ((a) < (b)) #define LQ(a, b) ((a) <= (b)) typedef int key_type; typedef struct ds_tree_node { key_type data; struct ds_tree_node * lchild, * rchild; }ds_tree_node, * ds_tree; status search_dst(ds_tree T, key_type key, ds_tree f, ds_tree *p) { if (!T) { *p = f; return FALSE; } else if (EQ(key, T->data)) { *p = T; return TRUE; } else if (LT(key, T->data)) return search_dst(T->lchild, key, T, p); else return search_dst(T->rchild, key, T, p); return OK; } status insert_ds_tree(ds_tree *T, key_type * elem) { ds_tree p, s; int n, i, temp; *T = NULL; printf("How many:"); SCAN_INT(n, temp); elem = (key_type *)malloc(sizeof(key_type) * (n + 1)); if (!elem) exit(OVERFLOW); for (i = 1; i <= n; ++i) elem[i] = i; for (i = 1; i <= n; ++i) if (!search_dst(*T, elem[i], NULL, &p)) { s = (ds_tree)malloc(sizeof(ds_tree_node)); if (!s) exit(OVERFLOW); s->data = elem[i]; s->lchild = s->rchild = NULL; if (!p) *T = s; else if (LT(elem[i], p->data)) p->lchild = s; else p->rchild = s; } return OK; } status visit(key_type data) { printf("%d/t", data); return OK; } status in_order_traverse(ds_tree T) { if (T) { in_order_traverse(T->lchild); visit(T->data); in_order_traverse(T->rchild); } return OK; } status delete(ds_tree *p) { ds_tree q, s; if (!(*p)->rchild) { q = *p; *p = (*p)->lchild; free(q); } else if (!(*p)->lchild) { q = *p; *p = (*p)->rchild; free(q); } else { q = *p; s = (*p)->lchild; while(s->rchild) { q = s; s = s->rchild; } (*p)->data = s->data; if (*p != q) q->rchild = s->lchild; else q->lchild = s->lchild; free(s); } return TRUE; } status delete_dst(ds_tree *T, key_type key) { if (!(*T)) return FALSE; else if (EQ(key, (*T)->data)) return delete(T); else if (LT(key, (*T)->data)) return delete_dst(&(*T)->lchild, key); else return delete_dst(&(*T)->rchild, key); } status delete_node(ds_tree *T) { key_type key; int temp; printf("Which to delete:"); SCAN_INT(key, temp); if (delete_dst(T, key)) { printf("key = %d deleted!/nNow the tree is:/n", key); in_order_traverse(*T); printf("/n"); } else printf("No element %d./n", key); return OK; } int main(void) { int elem[MAX]; ds_tree T; insert_ds_tree(&T, elem); printf("In_order_traverse result is:/n"); in_order_traverse(T); printf("/n"); delete_node(&T); return 0; }