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;
}
예제 #2
0
파일: main.c 프로젝트: herbertdai/ITA
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);
}
예제 #3
0
파일: treev2.c 프로젝트: tsiangleo/clrs
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);
}