rbtree_node_t *rbtree_remove(rbtree_t *tree, rbtree_node_t *node) { rbtree_node_t *remove, *child; if (node->left == tree->sentinel || node->right == tree->sentinel) remove = node; else remove = rbtree_successor(tree, node); if (remove->left != tree->sentinel) child = remove->left; else child = remove->right; child->parent = remove->parent; if (remove->parent == tree->sentinel) tree->root = child; else if (remove == remove->parent->left) remove->parent->left = child; else remove->parent->right = child; if (remove != node) { node->key = remove->key; } if (rbtree_is_black(remove)) rbtree_remove_fixup(tree, child); rbtree_node_delete(remove); return node; }
int main(void) { //int i; RB_TREE *T; T = tree_init(); node_insert(T, 23); node_insert(T, 94); node_insert(T, 32); node_insert(T, 84); node_insert(T, 12); node_insert(T, 8); node_insert(T, 82); node_insert(T, 31); node_insert(T, 59); node_insert(T, 41); node_insert(T, 73); //for ( i = 0 ; i < 1000 ; i++ ) { // key = rand() % 1000; // node_insert(T, key); //} inorder_tree_walk(T, T->root); printf("\n"); node_delete(T, 32); node_delete(T, 8); node_delete(T, 4); printf("after delete 32, 8, 4:\n"); inorder_tree_walk(T, T->root); printf("\n"); printf("sucessor of 23 is %d\n", rbtree_successor(T, rbtree_search(T, T->root, 23))->key); printf("predecessor of 84 is %d\n", rbtree_predecessor(T, rbtree_search(T, T->root, 84))->key); printf("the maximun is %d\n", rbtree_maximum(T, T->root)->key); printf("the minimum is %d\n", rbtree_minimum(T, T->root)->key); node_destory(T, T->root); tree_destory(T); exit(0); }
int main(int argc, char **argv) { void *rbtree; unsigned i = 0; int c; char buf[256]; if (parse_args(argc, argv) == -1) { usage(); exit(1); } FILE *fp = NULL; if (!infile) { fp = stdin; } else { fp = fopen(infile, "r"); if (!fp) { fprintf(stderr, "Can't open file: %s\n", infile); exit(1); } } rbtree = rbtree_new(key_cmp, free, free); while ((c = fgetc(fp)) != EOF) { if (c == '\n') { buf[i] = '\0'; rbtree_insert(rbtree, strdup(buf), strdup(buf)); memset(buf, 0, sizeof buf); i = 0; } else { buf[i++] = c; } } if (infile) fclose(fp); if (export) { fp = fopen(export, "w"); rbtree_dump(fp, rbtree, key_string); fclose(fp); } if (interactive) { void *node; while (1) { i = 0; memset(buf, 0, sizeof buf); printf("\n> "); while ((c = getc(stdin))) { if (c == EOF || c == '\n') break; if (i >= 256) { printf("buffer exceeded\n"); goto done; } buf[i++] = c; } if (c == EOF) break; if (!*buf) continue; buf[i] = '\0'; char *op = buf; while (*op && *op != ' ') op++; if (*op) { *op = '\0'; op++; } if (strncasecmp(buf, "successor", strlen("successor")) == 0) { node = rbtree_get(rbtree, op); if (node) { void *n2 = rbtree_successor(rbtree, node); if (n2) printf("successor: %s => %s\n", key_string(rbtree_node_key(n2)), (char *)rbtree_node_value(n2)); else printf("no successor\n"); } else { printf("%s (not found)\n", op); } } else if (strncasecmp(buf, "predecessor", strlen("predecessor")) == 0) { node = rbtree_get(rbtree, op); if (node) { void *n2 = rbtree_predecessor(rbtree, node); if (n2) printf("predecessor: %s => %s\n", key_string(rbtree_node_key(n2)), (char *)rbtree_node_value(n2)); else printf("no predecessor\n"); } else { printf("%s (not found)\n", op); } } else { node = rbtree_get(rbtree, buf); if (node) printf("%s => %s\n", key_string(rbtree_node_key(node)), (char *)rbtree_node_value(node)); else printf("%s (not found)\n", buf); } } } done: rbtree_free(rbtree); if (infile) free(infile); if (export) free(export); return 0; }