示例#1
0
Status RBTree_createNote(pt_RBRoot root,KeyType itemID,char *name,int money){
    RBTree newNode;
    if((RBTree_search(root,itemID))) return ERROR;
    if(!(RBTree_createNode_realize(newNode,NULL,NULL,NULL,itemID,name,money,RED))) return ERROR;
    if(!(RBTree_insert(root,newNode))) return ERROR;
    return OK;
}
示例#2
0
/**
 * Allocates a empty tree from heap, this creates a new tree 
 */
tree_t* tree_create(int * TREE_DATAS, int data_size) {

    int i = 0;
    gNil = tree_node_create_with_key(0);
    gNil->left_child = NULL;
    gNil->right_child = NULL;
    gNil->parent = NULL;
    gNil->key = -1;

    tree_t* this_tree = (tree_t*)malloc (sizeof(tree_t));
    treenode_t * new_node = tree_node_create_with_key(TREE_DATAS[0]);
    this_tree->root = new_node;
    this_tree->root->color = BLACK;
    
    for (i=1; i<data_size; i++) {

        new_node = tree_node_create_with_key(TREE_DATAS[i]);        
        
        //                add_node(this_tree->root, new_node);
        RBTree_insert(this_tree, new_node);
        //tree_insert(this_tree, new_node);
    }
    
    return this_tree;
}
示例#3
0
void test_redblacktree()
{
	const int length = 14;
	int array[length] = {
		2, 3, 4, 6, 7, 11, 9, 18, 12, 14, 19, 17, 22, 20
	};

	int i;
	RBTree tree = RBTree_nil();
	RBNode* node = NULL;

	// 插入节点生成树
	for (i = 0; i < length; i++) {
		node = (RBNode*)malloc(sizeof(RBNode));
		node->key = array[i];
		node->color = RB_Red;
		node->parent = RBTree_nil();
		node->leftChild = RBTree_nil();
		node->rightChild = RBTree_nil();

		RBTree_insert(&tree, node);	
	}

	RBTree_print(tree);

	// 插入测试
	node = (RBNode*)malloc(sizeof(RBNode));
	node->key = 21;

	printf("\n插入节点 %d\n", node->key);

	RBTree_insert(&tree, node);
	RBTree_print(tree);

	// 查找测试
	i = 6;
	node = RBTree_search(tree, i);

	if (node != RBTree_nil()) {
		printf("\n在红黑树中找到节点 %d\n", node->key);
	}
	else {
		printf("\n在红黑树中找不到节点 %d\n", i);
	}

	// 删除测试
	// 
	i = 4;// 取值 1, 2, 3, 4,分别对应 case 1, 2, 3, 4

	switch (i)
	{
	case 1:	// 兄弟为红色
		test_redblacktree_delete(&tree, 3);
		break;

	case 2:	// 兄弟为黑色,且兄弟的两孩子均为黑色
		test_redblacktree_delete(&tree, 12);
		break;

	case 3:	// 兄弟为黑色,且兄弟的左孩子为红色,右孩子均为黑色
		test_redblacktree_delete(&tree, 19);
		break;

	case 4:	// 兄弟为黑色,且兄弟的右孩子为红色
		test_redblacktree_delete(&tree, 9);
		break;
	}

	test_redblacktree_delete(&tree, 21);

	// 删除树
	for (i = 0; i < length; i++) {
		node = RBTree_search(tree, array[i]);

		if (node != RBTree_nil()) {
			printf("删除 %d\n", node->key);
			node = RBTree_delete(&tree, node);
			free(node);
		}
	}

	assert(tree == RBTree_nil());
}