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; }
/** * 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; }
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()); }