From 5954acb1a06731026f3dbaa94eb84eb63e9b9d15 Mon Sep 17 00:00:00 2001 From: jf-home Date: Mon, 2 Sep 2024 02:51:49 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8A=8Atree=E7=9A=84=E8=BF=AD=E4=BB=A3?= =?UTF-8?q?=E5=99=A8=E8=B0=83=E8=AF=95=E9=80=9A=E8=BF=87=E4=BA=86=EF=BC=8C?= =?UTF-8?q?left=E4=BC=98=E5=85=88=E7=9A=84=E5=89=8D=E5=BA=8F=E9=81=8D?= =?UTF-8?q?=E5=8E=86ok=EF=BC=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/tree.h | 16 ++++++++-------- src/tree.c | 35 +++++++++++++++++++++++++++++++---- test/test_tree.c | 30 +++++++++++++++++++++++------- 3 files changed, 62 insertions(+), 19 deletions(-) diff --git a/include/tree.h b/include/tree.h index 28859a6..4f234bd 100644 --- a/include/tree.h +++ b/include/tree.h @@ -23,15 +23,15 @@ typedef enum { }rbt_color; enum _order{ - ORDER_LEFT_PRE = 0x00, - ORDER_LEFT_IN = 0x01, - ORDER_LEFT_POST = 0x02, - ORDER_LEFT_BREADTH = 0x03, + ORDER_LEFT_PRE = 0x01, + ORDER_LEFT_IN = 0x02, + ORDER_LEFT_POST = 0x03, + ORDER_LEFT_BREADTH = 0x04, - ORDER_RIGHT_PRE = 0x04, - ORDER_RIGHT_IN = 0x05, - ORDER_RIGHT_POST = 0x06, - ORDER_RIGHT_BREADTH = 0x07, + ORDER_RIGHT_PRE = 0x05, + ORDER_RIGHT_IN = 0x06, + ORDER_RIGHT_POST = 0x07, + ORDER_RIGHT_BREADTH = 0x08, ORDER_PRE = ORDER_LEFT_PRE, ORDER_IN = ORDER_LEFT_IN, diff --git a/src/tree.c b/src/tree.c index b0eabc5..a3c1236 100644 --- a/src/tree.c +++ b/src/tree.c @@ -566,7 +566,8 @@ bool tree_clear(struct _tree* self) assert(self != NULL); if(self->_root == NULL) { - return false; + // return false; + return true; } struct _tree_node* node = self->_root; @@ -1485,9 +1486,27 @@ void* tree_begin(struct _tree* self) struct _tree_node* node = NULL; self->cur_node = self->_root; - self->stack->clear(self->stack); - node = self->cur_node; - self->stack->push(self->stack, &self->cur_node); + while(!self->stack->empty(self->stack) || self->cur_node != NULL) + { + if(self->cur_node != NULL) + { + node = self->cur_node; + + self->stack->push(self->stack, &self->cur_node); + self->cur_node = self->cur_node->left; + + break; + } + else + { + self->stack->pop(self->stack, &self->cur_node); + self->cur_node = self->cur_node->right; + } + } + if(node == NULL) + { + return NULL; + } return node->obj; }break; case ORDER_LEFT_IN: @@ -1537,7 +1556,11 @@ void* tree_next(struct _tree* self) if(self->cur_node != NULL) { node = self->cur_node; + self->stack->push(self->stack, &self->cur_node); + self->cur_node = self->cur_node->left; + + break; } else { @@ -1545,6 +1568,10 @@ void* tree_next(struct _tree* self) self->cur_node = self->cur_node->right; } } + if(node == NULL) + { + return NULL; + } return node->obj; }break; case ORDER_LEFT_IN: diff --git a/test/test_tree.c b/test/test_tree.c index 2bbceb2..59bed96 100644 --- a/test/test_tree.c +++ b/test/test_tree.c @@ -39,7 +39,7 @@ void test_avltree_num(void) int temp = 0; uint32_t len = sizeof(data) / sizeof(data[0]); - tree_t tree = tree_new(); + tree_t tree = tree_new,; tree_avl_init(tree, sizeof(int)); tree->print_obj = print_num; tree->compare = compare_num; @@ -211,7 +211,7 @@ void test_rbtree_num(void) int temp = 0; uint32_t len = sizeof(data) / sizeof(data[0]); - tree_t tree = tree_new(); + tree_t tree = tree_new,; tree_rb_init(tree, sizeof(int)); tree->print_obj = print_num; tree->compare = compare_num; @@ -343,7 +343,7 @@ void test_rbtree_struct(void) struct _student temp = {0}; uint32_t len = sizeof(data) / sizeof(data[0]); - tree_t tree = tree_new(); + tree_t tree = tree_new,; tree_rb_init(tree, sizeof(struct _student)); tree->print_obj = print_struct; tree->compare = compare_struct; @@ -463,14 +463,20 @@ void test_rbtree_struct(void) } #endif +static const int const 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 +}; + static void test_tree_iter(void) { uint32_t i = 0; - int data[] = { 2,1,3,4}; + // 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 count = 0; int temp = 0; @@ -492,16 +498,26 @@ static void test_tree_iter(void) // tree->preorder(tree, tree->_root); // printf("\n"); } + printf("insert = "); + tree->print_obj(&temp); + printf("size = %2d : \n", tree->size(tree)); + tree->preorder(tree, tree->_root); + printf("\n"); + + + // set order + tree->order(tree, ORDER_LEFT_PRE); + // tree->set_order(tree, ORDER_LEFT_IN); printf("\niter test\n"); int * iter = NULL; for(iter = tree->begin(tree); iter != tree->end(tree); iter = tree->next(tree)) { - printf("%d \n", *iter); - + printf("(%2d ) ", *iter); buff[count++] = *iter; } - TEST_ASSERT_EQUAL_INT_ARRAY(data, buff, count); + printf("\n"); + TEST_ASSERT_EQUAL_INT_ARRAY(expected_int_array[1], buff, count); TEST_ASSERT_FALSE(tree->empty(tree)); TEST_ASSERT_TRUE(tree->clear(tree));