迭代二进制树,无需控制堆栈或动态分配

时间:2009-11-15 23:10:16

标签: algorithm data-structures iterator range binary-tree

在给定以下约束的情况下,是否有高效,实用方法迭代二叉树:

  1. 您无法控制调用堆栈,因此可能无法使用递归。所有状态必须存在于迭代器/范围对象内,而不是在堆栈中。
  2. 算法中的任何地方都不能使用堆分配。
  3. 树可能是不可变的,因此您无法在其中存储迭代状态。
  4. 您没有父指针。
  5. 迭代器/范围结构不能太大,以至于传递给函数是完全不合理的。
  6. 编辑:

    1. 这不是作业。我实际上正在尝试设计一个在第二个堆栈上构建二进制树的库,并对堆分配(或缺少堆分配)做出很多保证。
    2. 树木平衡。 (它们是AVL树。)

2 个答案:

答案 0 :(得分:9)

它只能用于深度达到一定限度的树(因此也可以用于元素数量),因为它需要与树深度成比例的辅助存储器;当你在一个项目上进行迭代时,你需要跟踪下一个要进行的项目,如果你是最深的一个叶子,那么所需的“保持跟踪指针”的数量将是只比树的深度小1。例如,如果您可以接受限制为32的深度(因此不超过4,294,967,295个节点),则需要一个32位指针的辅助固定大小数组(加上其上的索引)。

对于非完全退化的二进制树(因此有许多节点大致与2**depth成比例,而不仅仅是depth ;-),这个固定数量的辅助内存应该是可接受的 - 即,只需按log(N)指针的顺序修复辅助内存,以便在具有最多N个节点的任何树上进行迭代。如果这是不可接受的,那么您的问题的答案“是否......?”是; - )。

答案 1 :(得分:5)

如果保证树的值按其值排序并且这些值严格上升(所有B> A,而不仅仅是B> = A),那么您可以使用无动态内存遍历无限大小的树。不过,你确实会受到性能影响。

要在值A之后找到下一个值,只需再次下降到树中,执行二进制(当然)搜索大于A的值。

我只是想到了这一点。如果有人可以证明我的想法是错误的,请继续!