为什么这个程序的空间复杂度为O(h)?其中h是btree的高度

时间:2017-09-27 21:50:56

标签: java algorithm data-structures time-complexity callstack

所以这个程序决定了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;
}

1 个答案:

答案 0 :(得分:1)

请注意,我们会提供帮助,但实际上我们不会为您做好功课。

  

令我困惑的是checkSymmetric在同一行中被调用两次。那么这意味着我们必须在每次调用checkSymmetric时向callstack添加两个新的堆栈帧吗?

不,因为这两个调用是顺序的,而不是并行的。根据定义,所有限定为执行一个调用的资源都是在第二次调用之前释放的 - 它们并非全部同时被保留。这肯定包括所涉及的所有堆栈帧。

  

如果那样的话我们不应该有O(2 ^ h)的空间复杂度吗?

情况并非如此,那么这对于空间复杂性有什么影响呢?