解法

一个树是不是另外的树的子结构 只有三种情况
第一种就是 根相等,第二种是 和左子树中的某一部分相等,第三种是和右子树的某一部分相等。
假设 我们遇到的情况是 根相等的情况,我们就到了root2是不是和root1相等的情况,递归遍历的情况 只有root2遍历到了null 就说明相等,其他情况 比如 root1先到null,或者val不相等 都是说明不是子树的情况。
然后我们只需要符合三种情况中的一种 就可以得出是不是子结构了。

代码

/**
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(root2 == null || root1 == null){ // 根据约定 空树 不是任意树的子结构
            return false;
        }
        // 第一个条件是 根相等 第二个条件是 root2 是root1左子树的子结构 第三个条件是 root2 是root1右子树的 子结构
        return isSubTree(root1,root2) || HasSubtree(root1.left,root2) || HasSubtree(root1.right,root2);
    }
    public boolean isSubTree(TreeNode root1,TreeNode root2){
        if(root2 == null){ //root2 遍历完了 说明是相等的情况
            return true;
        }
        if(root1==null || root1.val != root2.val){ // root1 提前结束 或者值不相等 都说明不是相等的情况
            return false;
        }
        // 这里是 左右子树比较。
        return isSubTree(root1.left,root2.left) && isSubTree(root1.right,root2.right);
    }
}