在Java中,调用方法时是否会在堆栈上复制堆栈对象?考虑一下这段代码 -
static void mirror(Node p){
if (p!=null) {
Node temp = null;
temp = p.left;
p.left = p.right;
p.right = temp;
mirror(p.left);
mirror(p.right);
}
}
空间复杂性是否会 -
编辑:其中n是树的深度
答案 0 :(得分:2)
他们两个都没有。
在传递对方法调用的参数的引用时,对象不被复制,但引用本身仍然占用堆栈空间,因此空间复杂度为O(n)
,假设n
}指的是二叉树的深度。
O(…)
表示法忽略了常量比例因子,因此O(n)
仅表示每次递归都需要一定量的堆栈空间,如果没有将任何参数传递给调用,则甚至为真方法。它没有说明需要多少空间。
编辑:现在你已经编辑了你的问题添加第3点,它是第3点,但并不完全是因为,如上所述,即使你没有在堆栈上推送引用,也需要堆栈空间。
另请注意,您必须明确n
所指的内容。如果n
是树的Node
总数,那么如果树是平衡的,则相当O(log(n))
。但如果n
是树的最大深度与最大递归深度相匹配,那么它是O(n)
。
答案 1 :(得分:0)
对象p不会在堆上复制,但对于每次递归,对p的引用都将放入堆栈中。