C/C++中具有固定大小堆栈的树遍历
Tree traversal with fixed size stack in C/C++
是否可以使用固定大小的堆栈遍历树结构(特别是八叉树,即二叉树的三维版本)?我不想使用递归,因为我的八叉树是相当深。
我正在遍历树来做一个范围搜索问题,以找到最接近查询点的所有点。所以在遍历中,我不会遍历那些根在搜索区域不相交的节点上的子树。
如果你的八叉树有父指针,我认为你可以在没有堆栈的情况下遍历它(例如,请参阅这个线程)。否则,无论跳过多少分支,您都需要一个与树的深度一样深的堆栈。
当然,您可以遍历树,而无需使用深度本机调用堆栈,使用延续传递样式技术,或者(这大致相同)通过制作虚拟机,将其调用堆栈实现为堆数据,或者(从另一个角度来看)通过编码堆栈自动机,将堆栈实现为显式堆数据结构(例如std::stack
)。
否则,你的C++幼稚代码可以在图灵机上运行,而这些野兽没有任何堆栈。
正如Ted Hopp的回答所表明的那样,您可能会受到Deutsch Schorr-Waite的垃圾收集技术的启发(每个节点有几个额外的比特来临时翻转参考方向并记住这一点),从而实现"无堆栈"遍历(但每个节点中都需要额外的比特)。但我相信在std::stack
或std::vector
中拥有自己的堆栈可能更简单。
是,您可以使用固定大小的堆栈遍历八叉树。
固定大小只需要与最长的八叉树深度一样大。
请记住,使用八叉树,每次深度遍历只能用3位内存记录。对于三个维度中的每一个,你只需要记录你是朝着积极还是消极的方向前进。
因此,即使八叉树深入1000,也可以存储375字节的递归。
相关文章:
- 有什么方法可以遍历结构吗
- 在循环中按顺序遍历成员变量
- 遍历模板参数
- 在遍历处理程序的向量时注册和注销处理程序
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- 遍历并行数组以确定C++中的最大数字
- 遍历顺序由 std::文件系统directory_iterator给出
- 遍历链表时的无限循环
- 遍历unordered_map向量
- 从预序遍历构造 bst 的 c++ 和 python 解决方案之间的区别
- C++声明双链表,使用两个 for 循环双向遍历列表并打印
- 如何正确地推回然后遍历堆中对象的向量?
- 在使用 In Order 遍历成员函数时引发异常(堆栈溢出)时出现问题
- 使用递归的顺序二叉树遍历与使用堆栈的优缺点
- 二叉树顺序遍历导致堆栈溢出
- 遍历堆栈
- C/C++中具有固定大小堆栈的树遍历
- 符号如何影响调用堆栈遍历
- 如何在C++中遍历堆栈
- 在c++ 11中遍历堆栈时,无效的范围表达式