判断 b是否为a的子树结构
a 为空 或者 b 为空,就肯定不是
否则的话 需要判断 b和a都是根调用辅助函数, ab是不是相同结构 b是不是a的左子树 b是不是a右子树

辅助函数 以a,b为根的树是否相同。
递归终止 当 a,b值都相同 的时候继续 如果递归到b == null 说明到头了 就返回true;
如果 a b的值不想等, 或者传入时 a为空 b不为空 他俩就不相同 返回 FALSE

然后分别对左右子树递归判断

为什么这里不能是
return IsContain(root1,root2) || HasSubtree(root1.left,root2) || HasSubtree(root1.right,root2);
都改成IsContain 因为这样只对根节点 和根节点的左右子树判断了,没有进行更深入的递归判断。所以需要 HasSubtree进行递归
return IsContain(root1,root2) || IsContain(root1.left,root2) || IsContain(root1.right,root2);

/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
 public boolean HasSubtree(TreeNode root1,TreeNode root2) {
        if(root1 == null || root2 == null)  return false;
        return IsContain(root1,root2) || HasSubtree(root1.left,root2) || HasSubtree(root1.right,root2);

    }

    public boolean IsContain(TreeNode root1,TreeNode root2){
        if(root2 == null) return true;
        if(root1 == null || root1.val != root2.val) return false;
        return IsContain(root1.left,root2.left) && IsContain(root1.right,root2.right);
    }
}