方法1:递归
时间复杂度:O ( M ∗ N )
当root1什么都没有的时候,在root1里面找不到任何节点直接返回false。
当root2提前终止了,此时还没有遇到不符合root1树的节点,直接返回true。

    public boolean isContains (TreeNode root1, TreeNode root2) {
        // write code here
        if(root1==null){
            return false;
        }
        return isContains(root1.left,root2) || isContains(root1.right,root2) || isSubTree(root1,root2);
    }

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

方法2:中序遍历+strings.contains()
将二叉树中序遍历之后,如果t2的序列化结果能在t1中找到能说明t2是t1的子树(KMP算法),当然这里直接调用 strings.contains()判断也是可以,反而性能更好一点

public boolean isContains (TreeNode root1, TreeNode root2) {
        // write code here
        StringBuffer res1=new StringBuffer();
        StringBuffer res2=new StringBuffer();
        preOrder(root1,res1);
        preOrder(root2,res2);
        if(res1.toString().contains(res2.toString())){
            return true;
        }
        else{
            return false;
        }
    }
    public void preOrder(TreeNode root,StringBuffer res){
        if(root==null){
            return;
        }
        preOrder(root.left,res);
        res.append(root.val);
        preOrder(root.right,res);
    }

方法3:序列化(中序)+KMP