C/C++中具有固定大小堆栈的树遍历

Tree traversal with fixed size stack in C/C++

本文关键字:堆栈 遍历 C++      更新时间:2023-10-16

是否可以使用固定大小的堆栈遍历树结构(特别是八叉树,即二叉树的三维版本)?我不想使用递归,因为我的八叉树是相当深。

我正在遍历树来做一个范围搜索问题,以找到最接近查询点的所有点。所以在遍历中,我不会遍历那些根在搜索区域不相交的节点上的子树。

如果你的八叉树有父指针,我认为你可以在没有堆栈的情况下遍历它(例如,请参阅这个线程)。否则,无论跳过多少分支,您都需要一个与树的深度一样深的堆栈。

当然,您可以遍历树,而无需使用深度本机调用堆栈,使用延续传递样式技术,或者(这大致相同)通过制作虚拟机,将其调用堆栈实现为堆数据,或者(从另一个角度来看)通过编码堆栈自动机,将堆栈实现为显式堆数据结构(例如std::stack)。

否则,你的C++幼稚代码可以在图灵机上运行,而这些野兽没有任何堆栈。

正如Ted Hopp的回答所表明的那样,您可能会受到Deutsch Schorr-Waite的垃圾收集技术的启发(每个节点有几个额外的比特来临时翻转参考方向并记住这一点),从而实现"无堆栈"遍历(但每个节点中都需要额外的比特)。但我相信在std::stackstd::vector中拥有自己的堆栈可能更简单。

,您可以使用固定大小的堆栈遍历八叉树。

固定大小只需要与最长的八叉树深度一样大。

请记住,使用八叉树,每次深度遍历只能用3位内存记录。对于三个维度中的每一个,你只需要记录你是朝着积极还是消极的方向前进。

因此,即使八叉树深入1000,也可以存储375字节的递归。