如何在不使用指针或引用的情况下迭代二叉树?

时间:2012-03-06 19:05:28

标签: algorithm tree binary-tree traversal

可以在不使用指针或引用的情况下迭代列表。 在某些情况下,这消除了实际拥有列表的需要。 请考虑以下代码,

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的方法,其中up​​per_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);

这一直困扰着我。

2 个答案:

答案 0 :(得分:2)

您无法迭代不存在的数据。第一个例子中显示的是一个打印0或1十次的循环。迭代数组(或任何其他数据结构)的想法是以某种方式处理每个元素,例如计算数组元素的总和。

换句话说,第一个例子是在10个元素的数组上模拟迭代,这些元素是0和1,一个接一个。因此,在每次迭代时,您都要根据其索引来预测值。

如果要计算二叉树中子节点的索引,可以使用heap分布公式:2n + 1和2n + 2,分别计算左右节点的索引,其中n为基于0的索引。根据计算的索引,您可以模拟节点的值。

答案 1 :(得分:0)

要在不构建树的情况下打印树结构的表示法,类似于打印序列而不是构建列表的方式,首先必须确定符号的外观。

你能写下一个例子吗?

例如,类似Lisp的符号?

((1 2)(3 4));;那是一棵树

另外,给定10的上限,意味着将有10个编号的叶节点,您应该打印多个可能的二叉树中的哪一个?

直接列表是一个退化二叉树,所以实际上你的简单for循环基本上可以满足作业问题。