【发布时间】:2012-02-17 01:07:30
【问题描述】:
是否可以在不使用节点堆栈或“已访问”标志的情况下在二叉树上执行 迭代 *预排序* 遍历?
据我所知,这种方法通常要求树中的节点具有指向其父节点的指针。现在,可以肯定的是,我知道如何使用父指针和访问标志执行预排序遍历,从而消除迭代遍历对节点堆栈的任何要求。
但是,我想知道是否真的需要访问标志。如果树有很多节点,它们会占用大量内存。此外,如果二叉树的许多前序树遍历同时并行进行,那么拥有它们也没有多大意义。
如果可以执行此操作,一些伪代码或更短的 C++ 代码示例将非常有用。
编辑:我确实不想使用递归进行前序遍历。我的问题的上下文是我在 GPU 上构建了一个八叉树(就像二叉树)。我想启动许多线程,每个线程都独立且并行地进行树遍历。
首先,CUDA 不支持递归。 其次,已访问标志的概念仅适用于单次遍历。由于许多遍历同时进行,因此在节点数据结构中具有visited-flags 字段是没有用的。它们仅在所有独立树遍历都/可以序列化的 CPU 上才有意义。更具体地说,在每次树遍历之后,我们可以在执行另一个预排序树遍历之前将访问标志设置为 false
【问题讨论】:
-
递归算不算使用栈?
-
感谢您指出这一点。请参阅编辑。我也不想使用递归。
-
为什么不能对访问的标志使用外部数据结构(即哈希表,访问后添加节点)?
-
树是否包含信息,对于每个节点,它的哪个子节点是“左”,哪个是“右”?
-
@max 是的,每个树节点都包含此信息。
标签: algorithm