所以我正在使用树实现来创建有序集ADT。其中一个要求是为集合实现迭代器。而且当我使用递归遍历树时,我在如何按顺序返回下一个元素时遇到了一些麻烦。我正在考虑使用while循环来到最左边的叶子(节点),但我不确定如何返回到父节点。以下是我正在使用的tree implementation及其header。这是set adt及其header。任何帮助将不胜感激。
/*
* Returns the next element in the sequence represented by the given
* set iterator.
*/
void *set_next(set_iter_t *iter)
{
if(iter->node == NULL)
printf("tree iterator exhausted");
else
{
void *elem;
while(iter->node->left != NULL)
iter->node = iter->node->left;
return elem;
}
}
编辑:我尝试将遍历存储在数组中,但似乎函数没有正确地遍历数组:
static int i = 0;
void *set_next(set_iter_t *iter)
{
if(iter->node == NULL)
printf("tree iterator exhausted");
else
{
int size = iter->node->numitems;
int arr[size];
int *p;
p = arr;
void *elem;
store_inorder(iter->node, p, i);
elem = (p+i);
return elem;
++i;
}
}
这是我用来将遍历存储在数组中的函数:
void store_inorder(tree_t *tree, int inorder[], int index_ptr)
{
if (tree == NULL)
return;
void *p = malloc(sizeof(intptr_t));;
p = tree->data;
/*first recur on left child */
store_inorder(tree->left, inorder, index_ptr);
inorder[index_ptr] = (intptr_t)tree->data;
(index_ptr)++; // increase index for next entry
/*now recur on right child */
store_inorder(tree->right, inorder, index_ptr);
}
答案 0 :(得分:0)
您可以通过将路径从当前位置存储回根目录来记住迭代器的位置。
想想Hänsel和Gretel。
答案 1 :(得分:0)
您可以简单地更改节点以使其包含父节点吗?如果迭代是问题定义的一部分,那么使用父指针可以使任务更容易。请注意,只要孩子通过其父母的正确孩子而不是最近的父母,就需要上去。