在c ++中的树结构上自定义迭代器

时间:2013-02-10 14:13:07

标签: c++ tree

我在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
}

现在的问题是:

如何实现这样的迭代器?

2 个答案:

答案 0 :(得分:1)

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

这是C / C ++中函数指针和函数指针数组的强大功能。

答案 1 :(得分:0)

如果树(通常)已排序,许多函数不会简单地迭代所有节点,然后找到最大值,只能在右子树中查找。

如果搜索最小值,则它位于最左边的子树中。

因此,迭代整个树的迭代器并不总是有意义的 但是如果你需要完全迭代所有节点,你可以使用函数指针或访问者模式(Erich Gamma,设计模式)。