【发布时间】:2012-02-05 11:04:08
【问题描述】:
是否可以使用固定大小的堆栈来遍历树结构(特别是八叉树,二叉树的 3-D 版本)?我不想使用递归,因为我的八叉树是 很深。
我正在遍历树进行范围搜索问题,以找到最接近查询点的所有点。所以在我的遍历中,我不会沿着那些以我的搜索区域不相交的节点为根的子树向下走。
【问题讨论】:
-
我猜你想避免递归,因为机器调用堆栈大小的实际限制。
是否可以使用固定大小的堆栈来遍历树结构(特别是八叉树,二叉树的 3-D 版本)?我不想使用递归,因为我的八叉树是 很深。
我正在遍历树进行范围搜索问题,以找到最接近查询点的所有点。所以在我的遍历中,我不会沿着那些以我的搜索区域不相交的节点为根的子树向下走。
【问题讨论】:
如果你的八叉树有父指针,我认为你可以在没有堆栈的情况下遍历它(例如,参见this thread)。否则,无论跳过多少分支,您都需要一个与树的深度一样深的堆栈。
【讨论】:
当然,您可以在不使用深层本机调用堆栈的情况下,使用延续传递风格技术,或者(这大致相同)通过制作虚拟机,将其调用堆栈实现为堆数据,或者(另一种观点)通过编码堆栈自动机,堆栈实现为显式堆数据结构(例如std::stack)。
想一想,你的 C++ 幼稚代码可以在图灵机上运行,而这些野兽没有任何堆栈。
正如Ted Hopp's answer 建议的那样,您可能会受到Deutsch-Schorr-Waite 的垃圾收集技术的启发(每个节点有一些额外的位来临时翻转参考方向并记住这一点)进行“无堆栈”遍历(但您需要在每个节点中添加额外的位)。但我相信在std::stack 或std::vector 中拥有自己的堆栈可能更简单。
【讨论】:
可以,可以用固定大小的栈遍历八叉树。
固定大小只需要与可能的最长八叉树深度一样大。
请记住,使用八叉树,每次深度遍历只需 3 位内存即可记录。对于三个维度中的每一个维度,你只需要记录你是走的是正向还是负向。
因此,即使您的八叉树深度为 1000,您也可以存储 375 个字节的递归。
【讨论】: