tree深度优先遍历的迭代器都调试通过了

This commit is contained in:
建峰 2025-04-24 18:49:00 +08:00
parent 8ffde2b608
commit 5ab918b067
2 changed files with 128 additions and 2 deletions

View File

@ -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;
}

View File

@ -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);