如何按顺序显示平衡二叉树的下一个元素? (为了)

时间:2018-03-25 14:33:40

标签: c set binary-tree abstract-data-type

所以我正在使用树实现来创建有序集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);
}

2 个答案:

答案 0 :(得分:0)

您可以通过将路径从当前位置存储回根目录来记住迭代器的位置。

想想Hänsel和Gretel。

答案 1 :(得分:0)

您可以简单地更改节点以使其包含父节点吗?如果迭代是问题定义的一部分,那么使用父指针可以使任务更容易。请注意,只要孩子通过其父母的正确孩子而不是最近的父母,就需要上去。