tree.hh - C ++ Leaf Traversal

时间:2011-09-08 04:13:43

标签: c++ tree

以下代码的输出不正确。它应该只输出树中的叶子:

tree<Node> gameTree;
tree<Node>::iterator root = gameTree.insert(gameTree.begin(),Node(14));
tree<Node>::iterator first = gameTree.append_child(root,Node(32.0));
tree<Node>::iterator second = gameTree.append_child(root,Node(64.0));
gameTree.append_child(second,Node(21.0));
gameTree.append_child(second,Node(24.0));

tree<Node>::iterator begin = gameTree.begin_leaf();
tree<Node>::iterator end = gameTree.end_leaf();
int x = 0;
while (begin != end) 
{ 
    cout << begin->value << endl; 
    begin++;
}

但它输出:

32
64
21
24

当输出应该是:

32
21
24

3 个答案:

答案 0 :(得分:2)

从文档中你应该使用leaf_iterator而不是迭代器,你看到的输出来自顺序遍历,你想做一个我正在猜测的叶子遍历。

顺便说一句,感谢您发布此消息我刚刚开始寻找树容器

HTH

答案 1 :(得分:2)

发生的事情是迭代器类实际上只是pre_order_traversal类的typedef。因此,当您将gameTree.beginLeaf()(返回leaf_iterator)的结果设置为迭代器时,它会调用pre_order_iterator的复制构造函数,因为有一个为pre_order_traversal(const iterator_base&)定义的构造函数(iterator_base是所有其他迭代器的超类,包括leaf_iterator),因此这将从leaf_iterator创建一个新的pre_order_iterator。然后,当您使用该迭代器时,它会执行深度优先遍历,而不是迭代遍历叶子。如果切换到leaf_iterator而不是迭代器,问题就会消失。

这也是下面评论中提到的直接形式(其中值未分配给迭代器)正常工作的原因。

答案 2 :(得分:1)

我不知道tree<>是什么,也不知道append_child的语义,但从我看来,32,64,21和24都低于层次结构的根(14岁的儿童和孙子女);我没有看到问题。

为什么要跳过64,但不是24?