【发布时间】:2012-03-06 19:05:27
【问题描述】:
可以在不使用指针或引用的情况下迭代列表。 在某些情况下,这消除了实际拥有列表的需要。 考虑以下代码,
int i;
for (i = 0; i < 10; ++i)
printf("%i ", i % 2);
它直接输出列表 0 1 0 1 0 1 0 1 0 1 而不实际将列表存储在内存中。
如何用二叉树做类似的事情?
请为以下代码展示一种实现 tree_iterator、new_root_tree_iterator 和 traverse_tree_iterator 的方法,其中 upper_boundary_of_tree 类似于列表示例中的数字 10,我不知道如何定义。
人们一直对我所说的 upper_boundary_of_tree 感到困惑。树的上边界不会用数字 10 表示。我不知道如何表示树的某些上边界。这是问题的一部分。树的上边界类似于上面列表代码中数字 10 的使用方式,因为它执行相同的功能,标记停止迭代的位置,但绝对不是一回事。
如果你需要,你也可以拥有一个 free_tree_iterator 函数。
tree_iterator i = new_root_tree_iterator();
while (traverse_tree_iterator(&i, upper_boundary_of_tree))
foobar(i);
这件事困扰了我一段时间。
【问题讨论】:
-
您是否尝试过自己解决这个问题?编写一个使用指针或引用的树迭代器。
-
将数字打印到文本流中的函数正在显示序列,而不是创建列表。抽象序列与列表不同。
-
如果您想使用未存储在内存中的列表,您需要惰性列表。惰性列表有可能产生无限数量的项目,同时由一些消耗列表的函数处理,这一切都发生在常量内存中。 (因为消费者正在沿着列表前进,失去了对前面的引用,这是垃圾收集的。)但这仍然涉及指针。
-
这不是懒惰,它只是树的功能表示,我想要。可以通过类型 (Natural -> x) 表示事物流 x。对于无限树,我想要类似的东西,一种类型,Index,其中 (Index -> x) 与 x 的无限二叉树相同。
标签: algorithm tree binary-tree traversal