寻找子树的空间复杂性

时间:2013-07-03 23:32:13

标签: c++ algorithm data-structures

有人可以告诉我为什么以下代码占用内存:O(logN)+ O(logM)?
代码是解决问题:给定大树T1,小树T2,检查T2是否是T1的子树。注意大小(T1)= N和大小(T2)= M.事实上,除了子树()和matchTree()的bool结果之外,我没有看到任何额外的内存。但IMO这个记忆应该是O(1)。如果我错了,请纠正我。

boolean containsTree(TreeNode t1, TreeNode t2) {
  if (t2 == null) return true; // The empty tree is always a subtree
  else return subTree(t1, t2);
}

boolean subTree(TreeNode r1, TreeNode r2) {
  if (r1 == null)
   return false; // big tree empty & subtree still not found.
  if (r1.data == r2.data) {
    if (matchTree(r1,r2)) return true;
  }
  return (subTree(r1.left, r2) || subTree(r1.right, r2));
}

boolean matchTree(TreeNode r1, TreeNode r2) {
 if (r2 == null && r1 == null)
     return true; // nothing left in the subtree
 if (r1 == null || r2 == null)
     return false; // big tree empty & subtree still not found
 if (r1.data != r2.data)
     return false; // data doesn’t match
 return (matchTree(r1.left, r2.left) && matchTree(r1.right, r2.right));
}

2 个答案:

答案 0 :(得分:3)

该函数以递归方式调用自身,因此尽管您没有明确使用内存,但堆栈将在调用堆栈中花费O(h1)+ O(h2)。如果树足够平衡,则与O(logn)+ O(logm)相同。

答案 1 :(得分:1)

递归需要堆栈空间,这是你要找的东西吗?