【问题标题】:Iterator Method for Binary Tree in CC中二叉树的迭代器方法
【发布时间】:2014-01-06 10:01:11
【问题描述】:

我得到了下面的代码来创建一个迭代器方法,以便在 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))

注意:只有在 传递给它的函数是单调的。函数 f 是单调的

x

编辑 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;
    }
}

有不少错误。有人可以帮忙吗?

【问题讨论】:

  • 我不理解你所说的“迭代器真的应该作为 void 函数来完成”的意思。看起来您应该只在每个节点上按顺序遍历 bst 和 node->item = fun(node->item)
  • 您是否获得过关于如何处理 *fun 的返回值或您的函数最终应返回为 int 的任何指导?

标签: c function tree iterator binary-tree


【解决方案1】:

您说您想要一个“迭代器”方法,但随后您将其描述为“将函数应用于树中的每个值”,这是一种“应用”方法,而不是“迭代器”方法。迭代器方法通常获取对数据结构的某个元素的引用并返回对下一个元素的引用(或修改该引用以引用下一个元素)。那么,您想要一个实际的迭代方法,还是想要一个您将称为“迭代”的应用方法,从而使您代码的所有未来读者感到困惑?

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

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

【讨论】:

  • 这不是深度优先而是有序,不是吗?我猜后序将是“深度优先”(在执行当前级别之前向下走)。
  • 是的,不是深度优先。只是递归。
  • 我当然可以通过添加return t->value; 将它变成一个整数函数吗?
  • @user3155247:没用——它只是返回根节点中的值。如果你必须有一个 int 返回类型,不妨添加return 0;
【解决方案2】:

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

所以你需要一个特殊的值来表明没有其他物品了;也许是 0?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-06
    • 2015-01-18
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多