我已经获得了以下代码,以便在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;
}
}
有很多错误。有人可以帮忙吗?
答案 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?