迭代树中的节点

时间:2013-12-06 19:47:57

标签: c++ tree iterator tree-traversal

我想创建一个可以处理我的自制结构的迭代器:

struct node {
int n; //data element
node * parent;
node * left;
node * right;  
node (int elem): n(elem){ //create root
     parent = NULL; left = NULL; right = NULL;
}
node (int elem, node* p): n(elem), parent(p) { //addchild
    left = NULL;
    right = NULL; 
}
node(int elem, node * p, node * l, node * r): n(elem), parent(p), left(l), right(r){ //insert element
}
};

首先,这可能吗?如果是:我如何开始遍历遍历树的迭代器。如果不是:如果我想访问列表中的数据元素,您建议我做什么?

2 个答案:

答案 0 :(得分:1)

提示:你的迭代器,当它前进时,应该去找父母并弄清楚它是否是该父母的左孩子或右孩子。那将告诉你下一步该去哪里。

答案 1 :(得分:1)

是的,鉴于您使用right指针(可能以遍历顺序指向下一个节点)概述的节点结构,实现正向迭代器应该很容易。

基本的想法是这样的:

template <class Node>
class iterator { 
    Node *pos;
public:
    iterator(Node *tree = nullptr) : pos(tree) {}
    iterator operator++() { pos = pos->right; return *this; }
    Node &operator*() { return *pos; }
    bool operator!=(iterator const &other) const { return pos != other.pos; }
};

然而,真正的迭代器中涉及的不止一点。特别是,您通常(总是?)想要指定诸如value_typereference_type和迭代器类别之类的内容。其中大部分都非常接近纯粹的样板,你可以通过派生std::iterator来处理大部分内容。

您(通常)也希望支持比我在此处显示的更多操作,例如修复后增量,operator==等。鉴于此作为“框架”,我认为填写这些空白应该相当简单。

我应该也指出Boost iterators库的存在。这简化了实现迭代器的任务(有点),并减少了你必须编写的样板(相当多)。