int main() { // stk_stack* enumResult; int option=0; int newKey,newKey2; int* newInt; red_black_node_struct* newNode; red_black_tree_struct* tree; tree=rb_tree_create(IntComp,IntDest,InfoDest,IntPrint,InfoPrint); while(option!=8) { printf("choose one of the following:\n"); printf("(1) add to tree\n(2) delete from tree\n(3) query\n"); printf("(4) find predecessor\n(5) find sucessor\n(6) enumerate\n"); printf("(7) print tree\n(8) quit\n"); do option=fgetc(stdin); while(-1 != option && isspace(option)); option-='0'; switch(option) { case 1: { printf("type key for new node\n"); scanf("%i",&newKey); newInt=(int*) malloc(sizeof(int)); *newInt=newKey; rb_tree_insert(tree,newInt,0); } break; case 2: { printf("type key of node to remove\n"); scanf("%i",&newKey); if ( ( newNode=rb_exact_query(tree,&newKey ) ) ) rb_delete(tree,newNode);/*assignment*/ else printf("key not found in tree, no action taken\n"); } break; case 3: { printf("type key of node to query for\n"); scanf("%i",&newKey); if ( ( newNode = rb_exact_query(tree,&newKey) ) ) {/*assignment*/ printf("data found in tree at location %i\n",(int)newNode); } else { printf("data not in tree\n"); } } break; case 4: { printf("type key of node to find predecessor of\n"); scanf("%i",&newKey); if ( ( newNode = rb_exact_query(tree,&newKey) ) ) {/*assignment*/ newNode=tree_predecessor(tree,newNode); if(tree->nil == newNode) { printf("there is no predecessor for that node (it is a minimum)\n"); } else { printf("predecessor has key %i\n",*(int*)newNode->key); } } else { printf("data not in tree\n"); } } break; case 5: { printf("type key of node to find successor of\n"); scanf("%i",&newKey); if ( (newNode = rb_exact_query(tree,&newKey) ) ) { newNode=tree_successor(tree,newNode); if(tree->nil == newNode) { printf("there is no successor for that node (it is a maximum)\n"); } else { printf("successor has key %i\n",*(int*)newNode->key); } } else { printf("data not in tree\n"); } } break; case 6: { printf("type low and high keys to see all keys between them\n"); /* scanf("%i %i",&newKey,&newKey2); enumResult=rbEnumerate(tree,&newKey,&newKey2); while ( (newNode = StackPop(enumResult)) ) { tree->PrintKey(newNode->key); printf("\n"); } free(enumResult); }*/ break; case 7: { rb_tree_print(tree); } break; case 8: { red_black_node_struct *ss ;//= (red_black_node_struct*)start( tree); for ( ss= start( tree) ; ss != NULL ; ss = next(tree) ){ printf("%d\n",*(int*)ss->key); } rb_tree_destroy(tree); return 0; } break; default: printf("Invalid input; Please try again.\n"); } } } return 0; }
void testBSTree() { printf("\nNow is Create Binary tree with node size %d >>>>>>>>>>\n", ARRAY_SIZE); randomize_in_place(A, ARRAY_SIZE); // randomize_maxnum(A, ARRAY_SIZE, ARRAY_SIZE); print_array(A, ARRAY_SIZE); startProfileTime(); tree_t * tree = tree_create(A, ARRAY_SIZE); endProfileTime("Create Binary search tree "); #if 0 printf("\nPre order traverse:\n"); tree_preorder_traverse(tree->root, my_treenode_key_traverse); printf("\nPost order traverse:\n"); tree_postorder_traverse(tree->root, my_treenode_key_traverse); printf("\nIn order traverse:\n"); tree_inorder_traverse(tree->root, my_treenode_key_traverse); #endif int key = 50; startProfileTime(); treenode_t * search_result = tree_search(tree->root, key); endProfileTime("Binary tree search"); if (search_result != get_nil_node()) { printf("Found key:%d\n", key); } else { printf(" Not found key:%d\n", key); } tree_left_rotate(tree, search_result); tree_right_rotate(tree, search_result); traverse_no_recurise(tree->root, my_treenode_key_traverse); treenode_t * max, * min; max = tree_max(tree->root); min = tree_min(tree->root); printf("\nmax = %ld\n min = %ld\n", max->key, min->key); treenode_t * bigger = tree_successor(search_result); printf("successor = %ld\n", (bigger!=NULL) ? bigger->key : -1); treenode_t * smaller = tree_predecessor(search_result); printf("perdecessor = %ld\n", (smaller!=NULL) ? smaller->key : -1); //Test delete: treenode_t * deleted_node = RBTree_delete(tree, search_result); // treenode_t * deleted_node = tree_delete(tree, search_result); if (deleted_node) printf("del %p, key=%ld from tree.\n", deleted_node, deleted_node->key); tree_inorder_traverse(tree->root, my_treenode_key_traverse); // traverse_no_recurise(tree->root, my_treenode_key_traverse); int height = get_tree_height(tree->root); printf("\nget tree h = %d\n", height); tree_destroy(tree, NULL); }
int main() { tnode_t *n; searchTree_t tree; tree.root = NULL; tree.size = 0; int loops = 10; int i,rd; int max = 9; int status = -2; srand(time(NULL)); for(i = 1;i<= loops;i++) { rd = rand() % max + 1; printf("rd:%d\n",rd); n = malloc(sizeof(tnode_t)); n->data = rd; status = tree_insert(&tree,n); if(status == -1) printf("insert error\n"); // inorder_walk_tree(tree.root,print_tnode); printf("\n"); } inorder_walk_tree(tree.root,print_tnode); printf("\n"); printf("deep walk\n"); deep_walk(tree.root); struct timeval start,end; gettimeofday(&start,NULL); tnode_t *r = tree_search_v1(tree.root , max - 1); gettimeofday(&end,NULL); if(r == NULL) printf("not found\n"); else printf("found %d at 0x%x\n",r->data,(unsigned int)r); printf("it takes %ld seconds,%ld micorseconds in v1\n",(long)(end.tv_sec - start.tv_sec),(long)(end.tv_usec - start.tv_usec)); r = NULL; gettimeofday(&start,NULL); r = tree_search_v2(tree.root , max - 1); gettimeofday(&end,NULL); if(r == NULL) printf("not found\n"); else printf("found %d at 0x%x\n",r->data,(unsigned int)r); printf("it takes %ld seconds,%ld micorseconds in v2\n",(long)(end.tv_sec - start.tv_sec),(long)(end.tv_usec - start.tv_usec)); tnode_t * min = tree_min(tree.root); if(min != NULL) printf("min is %d\n",min->data); tnode_t * mx = tree_max(tree.root); if(mx != NULL) printf("max is %d\n",mx->data); tnode_t *s = tree_successor(min); tnode_t *pre = tree_predecessor(s); printf("successor of min is %d\n",s->data); printf("predecessor of s is %d\n",pre->data); tnode_t *pre2 = tree_predecessor(mx); tnode_t *s2 = tree_successor(pre2); printf("predecessor of max is %d\n",pre2->data); printf("successor of pre2 is %d\n",s2->data); tree_delete(&tree, min); printf("delete\n"); inorder_walk_tree(tree.root,print_tnode); printf("\n"); printf("deep walk\n"); deep_walk(tree.root); tree_destroy(tree.root); }