最开始的思路是选择对二叉树进行三种遍历+层次遍历中的一种,然后保存节点到一个ArrayList中,在用containsAll方法。后来提交后才发现,题目问的是子结构,不是子树。于是选择了网上常见的递归式依次判断。当一个root2的值为Null时,说明这个结构的某一条路已经通了(及root1中也存在这一条路),故返回True。
代码如下:
public class Solution {
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
if(root2==null){
return false;
}
if(root1==null){
return false;
}
return isSubtree(root1,root2)||isSubtree(root1.left,root2)||isSubtree(root1.right,root2);
}
public static boolean isSubtree(TreeNode root1,TreeNode root2){
if(root2==null)//关键,顺序不能返
return true;
if(root1==null){
return false;
}
if(root1.val==root2.val){//这里一定不要直接比较他们两个地址是否相同。
return isSubtree(root1.left,root2.left)&&isSubtree(root1.right,root2.right);
}
return false;
}
}