【问题标题】:Custom iterator on a tree structure in c++C ++中树结构上的自定义迭代器
【发布时间】:2013-02-10 14:13:07
【问题描述】:

我正在用 C++ 实现一个树结构,它有一个这样的节点类:

class Node {
protected:
    // relations
    Node *_parent;
    std::vector<Node*> _children;

public:
    // some example method 
    void someMethod(Node *node) {

        // do something with *node

        for (int i = 0; i < node->_children; i++) {
            _children[i]->myFunction;
        }
    }
}

现在,为了处理树中的节点,我在示例中实现了递归函数,例如 someMethod

它有效,但我最终为每个在我的树上工作的新函数一遍又一遍地编写相同的递归代码。

有没有像在普通数组上那样迭代树结构的通用方法? 一些返回下一个对象的方法,直到我完成整个分支。

编辑:

感谢迄今为止发表评论的所有人,在您的帮助下,我可以缩小问题的范围。 根据我的理解(我是 C++ 新手),我需要一个迭代器类来封装用于遍历我的树的代码。

访问所有树成员应该就这么简单:

for (Node<Node*>::iterator it = _node.begin(); it != _node.end(); ++it) {
    Node *node = *it;
    // do something with *node
}

现在的问题是:

如何实现这样的迭代器?

【问题讨论】:

  • 你如何返回largestSoFar,究竟是什么问题?
  • 你可能也想看看这个:stackoverflow.com/questions/8961605/…
  • @ogzd 我编辑了我的问题,希望现在更清楚了。
  • @M3taSpl0it:我的树不是二叉树,每个节点可能有n个孩子。

标签: c++ tree


【解决方案1】:

将函数指针传递给返回您正在寻找的节点的递归函数。

这就是 C/C++ 中函数指针和函数指针数组的强大之处。

【讨论】:

  • 是的,没错。我在我的例子中省略了这一点。我实际上正在寻找一种更通用的递归方法替代方案。我已经编辑了我的问题。
【解决方案2】:

许多函数不会简单地遍历所有节点,如果树(通常)是排序的,那么要找到最大值,您只需在右子树中查找。

如果您在最左边的子树中搜索最小值。

因此,拥有一个迭代整个树的迭代器并不总是有意义的。
但是,如果您需要准确地遍历所有节点,则可以使用函数指针或访问者模式(Erich Gamma,设计模式)。

【讨论】:

  • 我想像在普通数组中一样迭代所有节点。
猜你喜欢
  • 2017-08-25
  • 2010-10-24
  • 2020-12-08
  • 2015-11-19
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
  • 2011-08-23
  • 1970-01-01
相关资源
最近更新 更多