From 5ab918b067c4a65f22781106cfb301228573f42a Mon Sep 17 00:00:00 2001 From: wjf-hs Date: Thu, 24 Apr 2025 18:49:00 +0800 Subject: [PATCH] =?UTF-8?q?tree=E6=B7=B1=E5=BA=A6=E4=BC=98=E5=85=88?= =?UTF-8?q?=E9=81=8D=E5=8E=86=E7=9A=84=E8=BF=AD=E4=BB=A3=E5=99=A8=E9=83=BD?= =?UTF-8?q?=E8=B0=83=E8=AF=95=E9=80=9A=E8=BF=87=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/tree.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++-- test/test_tree.c | 59 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 128 insertions(+), 2 deletions(-) diff --git a/src/tree.c b/src/tree.c index 84ee8a8..66e7ef3 100644 --- a/src/tree.c +++ b/src/tree.c @@ -1904,6 +1904,74 @@ iterator_t tree_iter(struct _tree* self, enum _order order) self->queue->clear(self->queue); self->_order = order; + + switch (self->_order) + { + case ORDER_LEFT_PRE: + case ORDER_RIGHT_PRE: + { + // pass + }break; + case ORDER_LEFT_IN: + case ORDER_RIGHT_IN: + { + // pass + }break; + case ORDER_LEFT_POST: + case ORDER_RIGHT_POST: + { + struct _tree_node* node = self->_root; + self->stack->clear(self->stack); + + stack_t stack = stack_new(sizeof(struct _tree_node*)); + if (self->_order == ORDER_LEFT_POST) + { + while (!stack->empty(stack) || node != NULL) + { + if (node != NULL) + { + self->stack->push(self->stack, &node); + + stack->push(stack, &node); + node = node->right; + } + else + { + stack->pop(stack, &node); + node = node->left; + } + } + } + else + { + while (!stack->empty(stack) || node != NULL) + { + if (node != NULL) + { + self->stack->push(self->stack, &node); + + stack->push(stack, &node); + node = node->left; + } + else + { + stack->pop(stack, &node); + node = node->right; + } + } + } + stack_free(&stack); + }break; + case ORDER_LEFT_BREADTH: + case ORDER_RIGHT_BREADTH: + { + // pass + }break; + default: + { + }break; + } + return iter; } @@ -1936,6 +2004,7 @@ const void* tree_iter_next(struct _iterator* iter) // // iter->_cur_node = node->next; // } + self->_iter._cur += 1; switch (self->_order) { case ORDER_LEFT_PRE: @@ -2092,8 +2161,6 @@ const void* tree_iter_next(struct _iterator* iter) { }break; } - - self->_iter._cur += 1; return obj; } diff --git a/test/test_tree.c b/test/test_tree.c index 6a67e6f..7af7608 100644 --- a/test/test_tree.c +++ b/test/test_tree.c @@ -926,12 +926,71 @@ static void test_avltree_iter_2(void) TEST_ASSERT_TRUE(tree->insert(tree, &temp)); } + printf("\n"); + iterator_t iter = tree->iter(tree, ORDER_LEFT_PRE); while(iter->hasnext(iter)) { temp = *(int *)iter->next(iter); tree->print_obj(&temp); } + printf("\n"); + + iter = tree->iter(tree, ORDER_LEFT_IN); + while(iter->hasnext(iter)) + { + temp = *(int *)iter->next(iter); + tree->print_obj(&temp); + } + printf("\n"); + + iter = tree->iter(tree, ORDER_LEFT_POST); + while(iter->hasnext(iter)) + { + temp = *(int *)iter->next(iter); + tree->print_obj(&temp); + } + printf("\n"); + + // iter = tree->iter(tree, ORDER_LEFT_BREADTH); + // while(iter->hasnext(iter)) + // { + // temp = *(int *)iter->next(iter); + // tree->print_obj(&temp); + // } + // printf("\n"); + + iter = tree->iter(tree, ORDER_RIGHT_PRE); + while(iter->hasnext(iter)) + { + temp = *(int *)iter->next(iter); + tree->print_obj(&temp); + } + printf("\n"); + + iter = tree->iter(tree, ORDER_RIGHT_IN); + while(iter->hasnext(iter)) + { + temp = *(int *)iter->next(iter); + tree->print_obj(&temp); + } + printf("\n"); + + iter = tree->iter(tree, ORDER_RIGHT_POST); + while(iter->hasnext(iter)) + { + temp = *(int *)iter->next(iter); + tree->print_obj(&temp); + } + printf("\n"); + + // iter = tree->iter(tree, ORDER_RIGHT_BREADTH); + // while(iter->hasnext(iter)) + // { + // temp = *(int *)iter->next(iter); + // tree->print_obj(&temp); + // } + // printf("\n"); TEST_ASSERT_TRUE(tree->clear(tree)); tree_free(&tree);