我在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
}
现在的问题是:
如何实现这样的迭代器?
答案 0 :(得分:1)
将函数指针传递给返回您正在寻找的节点的递归函数。
这是C / C ++中函数指针和函数指针数组的强大功能。
答案 1 :(得分:0)
如果树(通常)已排序,许多函数不会简单地迭代所有节点,然后找到最大值,只能在右子树中查找。
如果搜索最小值,则它位于最左边的子树中。
因此,迭代整个树的迭代器并不总是有意义的 但是如果你需要完全迭代所有节点,你可以使用函数指针或访问者模式(Erich Gamma,设计模式)。