/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
//private boolean flag = true;
/*public boolean isSubtree(TreeNode s, TreeNode t) {
//if(s == null) return false;
Stack<TreeNode> stack = new Stack<>();
stack.push(s);
while(!stack.isEmpty()){
TreeNode cur = stack.pop();
if(match(cur,t)) return true;
if(s.left!=null)
stack.push(s.left);
if(s.right!=null)
stack.push(s.right);
}
return false;
}
*/
public boolean isSubtree(TreeNode s, TreeNode t){
if(s == null && t == null) return true;
if(s == null || t == null) return false;
if(s.val == t.val)
return match(s,t)||isSubtree(s.left,t)||isSubtree(s.right,t);
else
return isSubtree(s.left,t)||isSubtree(s.right,t);
}
public boolean match(TreeNode t1, TreeNode t2){
if(t1 == null && t2 == null) return true;
if(t1 ==null || t2 == null) return false;
if(t1.val == t2.val)
return match(t1.left,t2.left)&&match(t1.right,t2.right);
return false;
}
}
如果将代码
if(s.val == t.val)
return match(s,t)||isSubtree(s.left,t)||isSubtree(s.right,t);
else
return isSubtree(s.left,t)||isSubtree(s.right,t);
改为
return match(s,t)||isSubtree(s.left,t)||isSubtree(s.right,t);
结果是
原因在于
第一种方法可以减少对s.val != t.val的情况下,对match(s,t)的无意义的调用;
疑问:
为什么用外层递归改为非递归遍历二叉树 s 会 产生 超出内存限制 异常
递归不是也要隐式递归,也要消耗内存空间?;