假设树是平衡的,那么常规用于1,000,000个元素的树的堆栈空间是多少?
void printTree(const Node *node) {
char buffer[1000];
if(node) {
printTree(node->left);
getNodeAsString(node, buffer);
puts(buffer);
printTree(node->right);
}
}
这是“实用程序员”中的算法问题之一,答案是需要21个缓冲区(lg(1m)〜= 20,另外1个位于最顶层)
但是我认为它需要多于1个缓冲区,其级别低于顶级,因为左侧和右侧节点有2个自身调用。有没有我错过的东西?
*对不起,但这不是一个功课。在书店的勘误表上看不到这个。
答案 0 :(得分:4)
首先进行左节点调用,然后该调用返回(因此它的堆栈可以重复使用),然后进行一些工作,然后进行正确的节点调用。
所以确实下一级有两个缓冲区,但这两个缓冲区是连续需要的,而不是并发的。因此,您只需要在高水位标记堆栈使用中计算一个缓冲区。重要的是函数的递归深度,而不是函数调用的次数。
这当然假设代码是用类似于C的语言编写的,并且C实现使用堆栈来自动变量(我还没有看到一个没有的),等等等等等等。
答案 1 :(得分:1)
第一个调用将一直递归到叶节点,然后返回。然后第二个呼叫将开始 - 但是当第二个呼叫发生时,第一个呼叫的所有激活记录都将从堆栈中清除。 IOW,在任何给定时间,只有来自堆栈中其中一个的数据。