所以这个程序决定了btree的对称性。 令我困惑的是checkSymmetric在同一行中被调用两次。那么这意味着我们必须在每次调用checkSymmetric时向callstack添加两个新的堆栈帧吗?如果那样的话我们不应该有O(2 ^ h)的空间复杂度吗?
public static boolean isSymmetric(BinaryTreeNode<Integer> tree) {
return tree == null || checkSymmetric(tree.left, tree.right);
}
private static boolean checkSymmetric(BinaryTreeNode<Integer> subtree0,
BinaryTreeNode<Integer> subtree1) {
if (subtree0 == null && subtree1 == null) {
return true;
} else if (subtree0 != null && subtree1 != null) {
return subtree0.data == subtree1.data
&& checkSymmetric(subtree0.left, subtree1.right)
&& checkSymmetric(subtree0.right, subtree1.left);
}
// One subtree is empty, and the other is not.
return false;
}
答案 0 :(得分:1)
请注意,我们会提供帮助,但实际上我们不会为您做好功课。
令我困惑的是checkSymmetric在同一行中被调用两次。那么这意味着我们必须在每次调用checkSymmetric时向callstack添加两个新的堆栈帧吗?
不,因为这两个调用是顺序的,而不是并行的。根据定义,所有限定为执行一个调用的资源都是在第二次调用之前释放的 - 它们并非全部同时被保留。这肯定包括所涉及的所有堆栈帧。
如果那样的话我们不应该有O(2 ^ h)的空间复杂度吗?
情况并非如此,那么这对于空间复杂性有什么影响呢?