【问题标题】:How I can iterate over a binary tree without using pointers or references?如何在不使用指针或引用的情况下迭代二叉树?
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您为我提供了树数据结构索引的良好表示,但是,如何表示列表的上限,它给出了何时停止迭代?
  • 因为它是一棵二叉树,所以 2 是 n 元素的幂 - 1 将为您提供 n 层树中的最大元素数量:2^n-1
  • 不,我不是这个意思。我需要一个树型的骨架。单元类型元素树的一些表示。
  • 是什么造就了一棵树?其节点之间的关系。每个节点都可以有子节点。这是树类型的定义。您首先必须定义您所追求的,类型构造或遍历的模拟。
  • 我试图解释上限类型需要什么,并且我也已经弄清楚了。我需要一个类型 struct TREE_BOUNDARY; typedef tree_boundary TREE_BOUNDARY; typedef struct { tree_boundary * left;树边界 * 对; } 树边界;
【解决方案2】:

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

你能写一个例子吗?

例如,类似 Lisp 的符号?

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

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

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

【讨论】:

  • 我想要一个符号,其中我有一个树的索引和元素列表。例如, [(i0, 'a'), (i1, 'b'), (i2, 'c')] 其中 i0, i1 和, i2 是我在想出正确符号时遇到的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-14
  • 2011-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-02
  • 1970-01-01
相关资源
最近更新 更多