diff --git a/doc/unicstl.log b/doc/unicstl.log new file mode 100644 index 0000000..992f313 Binary files /dev/null and b/doc/unicstl.log differ diff --git a/doc/unicstl.md b/doc/unicstl.md deleted file mode 100644 index c3062e7..0000000 --- a/doc/unicstl.md +++ /dev/null @@ -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 ----- -``` diff --git a/test/test_tree.c b/test/test_tree.c index fa2fb13..65c369d 100644 --- a/test/test_tree.c +++ b/test/test_tree.c @@ -511,7 +511,7 @@ static const int expected_int_array_orderpre_delete[15][15] = { { 13, }, }; -static void test_tree_iter(void) +static void test_avltree_iter(void) { uint32_t i = 0; // int data[] = { 2,1,3,4}; @@ -641,7 +641,6 @@ static void test_avltree_insert(void) TEST_ASSERT_NULL(tree); } - static void test_avltree_delete(void) { 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) { - RUN_TEST(test_tree_iter); - + RUN_TEST(test_avltree_iter); RUN_TEST(test_avltree_insert); 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_rbtree_num); // RUN_TEST(test_rbtree_struct);