Algorithm 有固定内存使用的树遍历算法吗?

Algorithm 有固定内存使用的树遍历算法吗?,algorithm,tree,tree-traversal,Algorithm,Tree,Tree Traversal,我有树的第一个节点。诸如此类: class TreeNode { int uniqueValue; List<TreeNode> children; } 类树节点{ int唯一值; 列出儿童名单; } 我想找到内存效率最高的方法来打印树的所有节点。这棵树可能很大,也可能很大。它可以是深的也可以是宽的。我知道递归算法和堆栈算法。我想找到的是独立于图形大小使用固定内存量的算法 树不是二进制的 没有这样的O(1)算法。最坏情况下的内存使用率始终为O(N)。您可以通过添加字段

我有树的第一个节点。诸如此类:

class TreeNode {
   int uniqueValue;
   List<TreeNode> children;
}
类树节点{
int唯一值;
列出儿童名单;
}
我想找到内存效率最高的方法来打印树的所有节点。这棵树可能很大,也可能很大。它可以是深的也可以是宽的。我知道递归算法和堆栈算法。我想找到的是独立于图形大小使用固定内存量的算法


树不是二进制的

没有这样的O(1)算法。最坏情况下的内存使用率始终为O(N)。您可以通过添加字段来“作弊”,以支持直接遍历到图形节点上。通过这种方式,如果您能够将图形加载到内存中,则可以遍历它(使用BFS或DFS)。

如果树恰好存储在一个扁平的堆状流中,例如长括号列表,则遍历它只需要足够的内存来记录您在流中的位置,这需要O(log(N))位

当然,正如Lior所说,您可以使用O(log(N))位的堆栈进行深度优先遍历

如果你的树引用了宇宙中的每一个粒子(比如1e85),技术上你只需要-85乘以3.3=281位=35字节。
我想你可以处理这个问题。

时间复杂度有哪些限制?另外,是否可以在类TreeNode中添加额外的指针?顺序是否重要?能否向每个节点添加布尔标志,以便将其标记为已打印?你在乎它是否需要O(n^2)时间吗?树是否真的很深,以至于常规的递归深度优先遍历会破坏堆栈?如果您可以遍历树到最深的级别,打印节点并删除它(!),然后从顶部重新开始,那么您的算法效率极低,但它不使用额外的内存。这是一个智力练习,还是你在寻找一个有用的答案?如果这棵树在记忆中合适的话,它应该可以通过(不超过树的最深层次的堆叠)来追索。弗洛里斯,谢谢!你的想法对我的制作没有用处,但很好,因为它确实使用了恒定的内存空间。@MooingDuck,怎么做?这棵树不是二叉树,它是不平衡的。@ile:你说对了一半,我做了一个假设。任何N元树都可以用O(max_depth)额外的内存使用量进行迭代。@MooingDuck,对,但是如果树不平衡,深度是O(N)。@ile:我不确定我会说O(N)作为“随机”树仍然惊人地接近O(log(N)),但是的,最坏的情况肯定是O(N)@MooingDuck No u是错误的,随机树的深度接近O(sqrt)(N) )