【发布时间】:2012-06-14 17:18:11
【问题描述】:
我正在阅读一本名为“算法简介”的书。我想你们很多人都知道。我刚刚碰到一个似乎相当困难的问题:
写一个 O(n) 时间的非递归过程,给定一个 n 节点的二叉树, 打印出每个节点的密钥。在树本身之外使用不超过恒定的额外空间,并且在此过程中不要修改树,即使是临时的。
我看到还有一个类似这样的问题:How to traverse a binary tree in O(n) time without extra memory 但主要区别在于我无法修改树。我正在考虑使用一些访问过的标志,但我还没有提炼出正确的解决方案。这可能是我看不到的显而易见的事情。你将如何设计一种算法来解决这个问题?甚至一些指向答案的指针也将不胜感激。
【问题讨论】:
-
您可以使用堆栈使用
O(logn)额外内存来完成此操作。没有额外的内存听起来很难。 -
我不会使用堆栈,因为它不是 O(1) 空间。这也没有意义,因为本书中的前一个练习要求您使用堆栈编写一个非递归遍历过程。
-
这棵树是搜索树/有序的吗?我们需要一种方法来记住我们已经打印的内容。
-
正如问题所述,它只是一个n节点二叉树。
-
@ThomasAhle 你假设树是平衡的,否则是
O(n)额外的内存。
标签: algorithm binary-tree