C中二叉树的迭代器方法

时间:2014-01-02 23:03:18

标签: c function tree iterator binary-tree

我已经获得了以下代码,以便在C中的二叉树上使用迭代器方法。即将函数应用于二叉树中的每个值。

int bst_char_iterate(bst_char *t, char (*fun)(char item))

“Bst_char * t”等同于指向树的指针,“* fun”等同于指向函数调用的指针,“item”等于调用该函数的值。

我认为迭代器应该作为void函数完成,所以我对如何处理它感到迷茫。

请帮忙!

编辑:我收到的指示如下:

  

向库中添加一个新方法,将函数应用于每个值   在树上。 (这是树的迭代器方法。)

     

int bst_char_iterate(bst_char * t,char(* fun)(char item))

     

注意:如果是,则此方法仅保留BST属性   传递给它的函数是单调的。

时,函数f是单调的      

x <= y(箭头)f(x)&lt; = f(y)。

编辑2:以下内容对我没用:

int bst_char_iterate(bst_char *t, char (*fun)(char item)) {
    assert(t!=NULL);
    struct node * p = t->root;
    if (p!=NULL) {
       p->item = fun(p->item);
       p->left->item = bst_char_iterate(t,fun(p->left));
       p->right->item = bst_char_iterate(t,fun(p->right));
    } else {
       return 0;
    }
}

有很多错误。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:3)

你说你想要一个“迭代器”方法,但是你将其描述为“将一个函数应用于树中的每个值”,这是一个“apply”方法,而不是“迭代器”方法。迭代器方法通常引用数据结构的某个元素,并返回对下一个元素的引用(或修改引用以引用下一个元素)。那么你想要一个实际的迭代方法,或者你想要一个你将要称之为“迭代”的应用方法,从而混淆所有未来的代码读者?

如果是后者,你需要一个遍历树的函数,为每个值调用函数。一个简单的递归遍历应该可以解决这个问题:

void bst_char_apply(bst_char *t, void (*fun)(char item)) {
    if (t->left) bst_char_apply(t->left, fun);
    fun(t->value);
    if (t->right) bst_char_apply(t->right, fun);
}

答案 1 :(得分:0)

您应该在给定项目后返回下一个BST项目。然后可以使用新返回的项再次调用该函数,之后应该返回该项,依此类推,直到结束。

所以你需要一个特殊值来表示没有剩下另一个项目;也许0?