rbt测试通过

This commit is contained in:
建峰 2024-09-02 21:14:16 +08:00
parent 804075ab5f
commit d8d6256c0a
3 changed files with 233 additions and 65 deletions

BIN
doc/unicstl.log Normal file

Binary file not shown.

View File

@ -1,61 +0,0 @@
# tree
```
----- unicstl test -----
----- test_tree_num -----
----- insert -----
insert = ( 5 ) size = 1 : ( 5 )
insert = ( 2 ) size = 2 : ( 5 ) ( 2 )
insert = ( 3 ) size = 3 : ( 3 ) ( 2 ) ( 5 )
insert = ( 1 ) size = 4 : ( 3 ) ( 2 ) ( 1 ) ( 5 )
insert = ( 7 ) size = 5 : ( 3 ) ( 2 ) ( 1 ) ( 5 ) ( 7 )
insert = ( 8 ) size = 6 : ( 3 ) ( 2 ) ( 1 ) ( 7 ) ( 5 ) ( 8 )
insert = ( 6 ) size = 7 : ( 3 ) ( 2 ) ( 1 ) ( 7 ) ( 5 ) ( 6 ) ( 8 )
insert = ( 4 ) size = 8 : ( 3 ) ( 2 ) ( 1 ) ( 7 ) ( 5 ) ( 4 ) ( 6 ) ( 8 )
insert = ( 9 ) size = 9 : ( 3 ) ( 2 ) ( 1 ) ( 7 ) ( 5 ) ( 4 ) ( 6 ) ( 8 ) ( 9 )
insert = (10 ) size = 10 : ( 3 ) ( 2 ) ( 1 ) ( 7 ) ( 5 ) ( 4 ) ( 6 ) ( 9 ) ( 8 ) (10 )
insert = (12 ) size = 11 : ( 7 ) ( 3 ) ( 2 ) ( 1 ) ( 5 ) ( 4 ) ( 6 ) ( 9 ) ( 8 ) (10 ) (12 )
insert = (11 ) size = 12 : ( 7 ) ( 3 ) ( 2 ) ( 1 ) ( 5 ) ( 4 ) ( 6 ) ( 9 ) ( 8 ) (11 ) (10 ) (12 )
insert = (15 ) size = 13 : ( 7 ) ( 3 ) ( 2 ) ( 1 ) ( 5 ) ( 4 ) ( 6 ) (11 ) ( 9 ) ( 8 ) (10 ) (12 ) (15 )
insert = (14 ) size = 14 : ( 7 ) ( 3 ) ( 2 ) ( 1 ) ( 5 ) ( 4 ) ( 6 ) (11 ) ( 9 ) ( 8 ) (10 ) (14 ) (12 ) (15 )
insert = (13 ) size = 15 : ( 7 ) ( 3 ) ( 2 ) ( 1 ) ( 5 ) ( 4 ) ( 6 ) (11 ) ( 9 ) ( 8 ) (10 ) (14 ) (12 ) (13 ) (15 )
----- preorder -----
( 7 ) ( 3 ) ( 2 ) ( 1 ) ( 5 ) ( 4 ) ( 6 ) (11 ) ( 9 ) ( 8 ) (10 ) (14 ) (12 ) (13 ) (15 )
----- inorder -----
( 1 ) ( 2 ) ( 3 ) ( 4 ) ( 5 ) ( 6 ) ( 7 ) ( 8 ) ( 9 ) (10 ) (11 ) (12 ) (13 ) (14 ) (15 )
----- postorder -----
( 1 ) ( 2 ) ( 4 ) ( 6 ) ( 5 ) ( 3 ) ( 8 ) (10 ) ( 9 ) (13 ) (12 ) (15 ) (14 ) (11 ) ( 7 )
----- breadth -----
( 7 ) ( 3 ) (11 ) ( 2 ) ( 5 ) ( 9 ) (14 ) ( 1 ) ( 4 ) ( 6 ) ( 8 ) (10 ) (12 ) (15 ) (13 )
----- right priority -----
----- preorder(right) -----
( 7 ) (11 ) (14 ) (15 ) (12 ) (13 ) ( 9 ) (10 ) ( 8 ) ( 3 ) ( 5 ) ( 6 ) ( 4 ) ( 2 ) ( 1 )
----- inorder(right) -----
(15 ) (14 ) (13 ) (12 ) (11 ) (10 ) ( 9 ) ( 8 ) ( 7 ) ( 6 ) ( 5 ) ( 4 ) ( 3 ) ( 2 ) ( 1 )
----- postorder(right) -----
(15 ) (13 ) (12 ) (14 ) (10 ) ( 8 ) ( 9 ) (11 ) ( 6 ) ( 4 ) ( 5 ) ( 1 ) ( 2 ) ( 3 ) ( 7 )
----- breadth(right) -----
( 7 ) (11 ) ( 3 ) (14 ) ( 9 ) ( 5 ) ( 2 ) (15 ) (12 ) (10 ) ( 8 ) ( 6 ) ( 4 ) ( 1 ) (13 )
----- left priority -----
----- preorder -----
( 7 ) ( 3 ) ( 2 ) ( 1 ) ( 5 ) ( 4 ) ( 6 ) (11 ) ( 9 ) ( 8 ) (10 ) (14 ) (12 ) (13 ) (15 )
delete = ( 5 ) size = 14 : ( 7 ) ( 3 ) ( 2 ) ( 1 ) ( 6 ) ( 4 ) (11 ) ( 9 ) ( 8 ) (10 ) (14 ) (12 ) (13 ) (15 )
delete = ( 2 ) size = 13 : ( 7 ) ( 3 ) ( 1 ) ( 6 ) ( 4 ) (11 ) ( 9 ) ( 8 ) (10 ) (14 ) (12 ) (13 ) (15 )
delete = ( 3 ) size = 12 : ( 7 ) ( 4 ) ( 1 ) ( 6 ) (11 ) ( 9 ) ( 8 ) (10 ) (14 ) (12 ) (13 ) (15 )
delete = ( 1 ) size = 11 : (11 ) ( 7 ) ( 4 ) ( 6 ) ( 9 ) ( 8 ) (10 ) (14 ) (12 ) (13 ) (15 )
delete = ( 7 ) size = 10 : (11 ) ( 8 ) ( 4 ) ( 6 ) ( 9 ) (10 ) (14 ) (12 ) (13 ) (15 )
delete = ( 8 ) size = 9 : (11 ) ( 9 ) ( 4 ) ( 6 ) (10 ) (14 ) (12 ) (13 ) (15 )
delete = ( 6 ) size = 8 : (11 ) ( 9 ) ( 4 ) (10 ) (14 ) (12 ) (13 ) (15 )
delete = ( 4 ) size = 7 : (11 ) ( 9 ) (10 ) (14 ) (12 ) (13 ) (15 )
delete = ( 9 ) size = 6 : (12 ) (11 ) (10 ) (14 ) (13 ) (15 )
delete = (10 ) size = 5 : (12 ) (11 ) (14 ) (13 ) (15 )
delete = (12 ) size = 4 : (13 ) (11 ) (14 ) (15 )
delete = (11 ) size = 3 : (14 ) (13 ) (15 )
delete = (15 ) size = 2 : (14 ) (13 )
delete = (14 ) size = 1 : (13 )
delete = (13 ) size = 0 :
----- empty -----
```

View File

@ -511,7 +511,7 @@ static const int expected_int_array_orderpre_delete[15][15] = {
{ 13, }, { 13, },
}; };
static void test_tree_iter(void) static void test_avltree_iter(void)
{ {
uint32_t i = 0; uint32_t i = 0;
// int data[] = { 2,1,3,4}; // int data[] = { 2,1,3,4};
@ -641,7 +641,6 @@ static void test_avltree_insert(void)
TEST_ASSERT_NULL(tree); TEST_ASSERT_NULL(tree);
} }
static void test_avltree_delete(void) static void test_avltree_delete(void)
{ {
uint32_t i = 0; uint32_t i = 0;
@ -688,13 +687,243 @@ static void test_avltree_delete(void)
} }
static const int rbt_expected_int_array[9][15] = {
{ 5, 2, 3, 1, 7, 8, 6, 4, 9, 10, 12, 11, 15, 14, 13}, // original data
{ 7, 3, 2, 1, 5, 4, 6, 11, 9, 8, 10, 14, 12, 13, 15}, // order_left_pre
{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, // order_left_in
{ 1, 2, 4, 6, 5, 3, 8, 10, 9, 13, 12, 15, 14, 11, 7}, // order_left_post
{ 7, 3, 11, 2, 5, 9, 14, 1, 4, 6, 8, 10, 12, 15, 13}, // order_left_breadth
{ 7, 11, 14, 15, 12, 13, 9, 10, 8, 3, 5, 6, 4, 2, 1}, // order_right_pre
{ 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1}, // order_right_in
{ 15, 13, 12, 14, 10, 8, 9, 11, 6, 4, 5, 1, 2, 3, 7}, // order_right_post
{ 7, 11, 3, 14, 9, 5, 2, 15, 12, 10, 8, 6, 4, 1, 13}, // order_right_breadth
};
static const int rbt_expected_int_array_orderpre_insert[15][15] = {
{ 5, },
{ 5, 2, },
{ 3, 2, 5, },
{ 3, 2, 1, 5, },
{ 3, 2, 1, 5, 7, },
{ 3, 2, 1, 7, 5, 8, },
{ 3, 2, 1, 7, 5, 6, 8, },
{ 3, 2, 1, 7, 5, 4, 6, 8, },
{ 3, 2, 1, 7, 5, 4, 6, 8, 9, },
{ 3, 2, 1, 7, 5, 4, 6, 9, 8, 10, },
{ 7, 3, 2, 1, 5, 4, 6, 9, 8, 10, 12, },
{ 7, 3, 2, 1, 5, 4, 6, 9, 8, 11, 10, 12, },
{ 7, 3, 2, 1, 5, 4, 6, 9, 8, 11, 10, 12, 15, },
{ 7, 3, 2, 1, 5, 4, 6, 9, 8, 11, 10, 14, 12, 15, },
{ 7, 3, 2, 1, 5, 4, 6, 11, 9, 8, 10, 14, 12, 13, 15, },
};
static const int rbt_expected_int_array_orderpre_delete[15][15] = {
{ 7, 3, 2, 1, 5, 4, 6, 11, 9, 8, 10, 14, 12, 13, 15, },
{ 7, 3, 2, 1, 6, 4, 11, 9, 8, 10, 14, 12, 13, 15, },
{ 7, 3, 1, 6, 4, 11, 9, 8, 10, 14, 12, 13, 15, },
{ 7, 4, 1, 6, 11, 9, 8, 10, 14, 12, 13, 15, },
{ 11, 7, 4, 6, 9, 8, 10, 14, 12, 13, 15, },
{ 11, 8, 4, 6, 9, 10, 14, 12, 13, 15, },
{ 11, 9, 4, 6, 10, 14, 12, 13, 15, },
{ 11, 9, 4, 10, 14, 12, 13, 15, },
{ 11, 9, 10, 14, 12, 13, 15, },
{ 11, 10, 14, 12, 13, 15, },
{ 14, 12, 11, 13, 15, },
{ 14, 13, 11, 15, },
{ 14, 13, 15, },
{ 14, 13, },
{ 13, },
};
static void test_rbtree_iter(void)
{
uint32_t i = 0;
// int data[] = { 2,1,3,4};
// int data[] = { 1,2,3,4,5,6};
// int data[] = { 5,2,3,1,7,8,6 };
// int data[] = { 5,2,3,1,7,8,6,4,9,10,12,11,15,14,13 };
int data[15] = { 5, 2, 3, 1, 7, 8, 6, 4, 9, 10, 12, 11, 15, 14, 13, };
int buff[32];
int temp = 0;
uint32_t len = sizeof(data) / sizeof(data[0]);
int * iter = NULL;
int count = 0;
tree_t tree = tree_new();
TEST_ASSERT_NOT_NULL(tree);
tree_rb_init(tree, sizeof(int));
tree->print_obj = print_num;
tree->compare = compare_num;
for (i = 0; i < len; i++)
{
temp = data[i];
TEST_ASSERT_TRUE(tree->insert(tree, &temp));
for (count = 0, iter = tree->begin(tree); iter != tree->end(tree); iter = tree->next(tree))
{
buff[count++] = *iter;
}
TEST_ASSERT_EQUAL_INT_ARRAY(rbt_expected_int_array_orderpre_insert[i], buff, count);
}
for(i = 1; i < 9; i++)
{
tree->set_order(tree, i); //ORDER_LEFT_IN
// printf("\n ----- iter test -----\n");
for (count = 0, iter = tree->begin(tree); iter != tree->end(tree); iter = tree->next(tree))
{
// printf("(%2d ) ", *iter);
buff[count++] = *iter;
}
// printf("\n");
TEST_ASSERT_EQUAL_INT_ARRAY(rbt_expected_int_array[i], buff, count);
}
#if 0
tree->order(tree, true);
printf("\n\nactual data = \n");
tree->postorder(tree, tree->_root);
printf("\n");
// set order
// tree->set_order(tree, ORDER_LEFT_PRE);
// tree->set_order(tree, ORDER_LEFT_IN);
// tree->set_order(tree, ORDER_LEFT_POST);
// tree->set_order(tree, ORDER_LEFT_BREADTH);
// tree->set_order(tree, ORDER_RIGHT_PRE);
// tree->set_order(tree, ORDER_RIGHT_IN);
tree->set_order(tree, ORDER_RIGHT_POST);
// tree->set_order(tree, ORDER_RIGHT_BREADTH);
printf("\n ----- iter data -----\n");
for (count = 0, iter = tree->begin(tree); iter != tree->end(tree); iter = tree->next(tree))
{
printf("(%2d ) ", *iter);
buff[count++] = *iter;
}
printf("\n");
TEST_ASSERT_EQUAL_INT_ARRAY(expected_int_array[tree->_order], buff, count);
#endif
TEST_ASSERT_FALSE(tree->empty(tree));
TEST_ASSERT_TRUE(tree->clear(tree));
TEST_ASSERT_TRUE(tree->empty(tree));
TEST_ASSERT_TRUE(tree->clear(tree));
tree_free(&tree);
TEST_ASSERT_NULL(tree);
}
static void test_rbtree_insert(void)
{
uint32_t i = 0;
// int data[] = { 2,1,3,4};
// int data[] = { 1,2,3,4,5,6};
// int data[] = { 5,2,3,1,7,8,6 };
int data[15] = { 5, 2, 3, 1, 7, 8, 6, 4, 9, 10, 12, 11, 15, 14, 13, };
int buff[32];
int temp = 0;
uint32_t len = sizeof(data) / sizeof(data[0]);
int * iter = NULL;
int count = 0;
tree_t tree = tree_new();
TEST_ASSERT_NOT_NULL(tree);
tree_rb_init(tree, sizeof(int));
tree->print_obj = print_num;
tree->compare = compare_num;
for (i = 0; i < len; i++)
{
temp = data[i];
TEST_ASSERT_TRUE(tree->insert(tree, &temp));
for (count = 0, iter = tree->begin(tree); iter != tree->end(tree); iter = tree->next(tree))
{
buff[count++] = *iter;
}
TEST_ASSERT_EQUAL_INT_ARRAY(rbt_expected_int_array_orderpre_insert[i], buff, count);
}
for(i = 1; i < 9; i++)
{
tree->set_order(tree, i); //ORDER_LEFT_IN
// printf("\n ----- iter test -----\n");
for (count = 0, iter = tree->begin(tree); iter != tree->end(tree); iter = tree->next(tree))
{
// printf("(%2d ) ", *iter);
buff[count++] = *iter;
}
// printf("\n");
TEST_ASSERT_EQUAL_INT_ARRAY(rbt_expected_int_array[i], buff, count);
}
tree_free(&tree);
TEST_ASSERT_NULL(tree);
}
static void test_rbtree_delete(void)
{
uint32_t i = 0;
int data[15] = { 5, 2, 3, 1, 7, 8, 6, 4, 9, 10, 12, 11, 15, 14, 13, };
int buff[32];
int temp = 0;
uint32_t len = sizeof(data) / sizeof(data[0]);
int * iter = NULL;
int count = 0;
tree_t tree = tree_new();
TEST_ASSERT_NOT_NULL(tree);
tree_rb_init(tree, sizeof(int));
tree->print_obj = print_num;
tree->compare = compare_num;
for (i = 0; i < len; i++)
{
temp = data[i];
TEST_ASSERT_TRUE(tree->insert(tree, &temp));
}
for (i = 0; i < len; i++)
{
for (count = 0, iter = tree->begin(tree); iter != tree->end(tree); iter = tree->next(tree))
{
buff[count++] = *iter;
// printf("(%2d ) ", *iter);
}
// printf("\n");
TEST_ASSERT_EQUAL_INT_ARRAY(rbt_expected_int_array_orderpre_delete[i], buff, count);
temp = data[i];
// delete
TEST_ASSERT_TRUE(tree->delete(tree, &temp));
}
//
TEST_ASSERT_FALSE(tree->delete(tree, &temp));
tree_free(&tree);
TEST_ASSERT_NULL(tree);
}
void test_tree(void) void test_tree(void)
{ {
RUN_TEST(test_tree_iter); RUN_TEST(test_avltree_iter);
RUN_TEST(test_avltree_insert); RUN_TEST(test_avltree_insert);
RUN_TEST(test_avltree_delete); RUN_TEST(test_avltree_delete);
RUN_TEST(test_rbtree_iter);
RUN_TEST(test_rbtree_insert);
RUN_TEST(test_rbtree_delete);
// RUN_TEST(test_avltree_num); // RUN_TEST(test_avltree_num);
// RUN_TEST(test_rbtree_num); // RUN_TEST(test_rbtree_num);
// RUN_TEST(test_rbtree_struct); // RUN_TEST(test_rbtree_struct);