首先:判断结构相同必须需要的函数
public boolean isSame(TreeNode root1,TreeNode root2){
        if(root2 == null) return true;           
        if(root1 == null) return false;        
        return root1.val == root2.val 
            && isSame(root1.left, root2.left)
            && isSame(root1.right, root2.right);
    }

第一种:递归判断  利用好短路特性 20ms
public boolean fun1(TreeNode root1, TreeNode root2) {
        if(root1 == null || root2 == null) return false;
        return isSame(root1, root2) || isSame(root1.left, root2) || isSame(root1.right,root2); 
    }

第二:非递归实现:广度优先遍历判断 14ms
public boolean fun2(TreeNode root1, TreeNode root2) {
        if(root1 == null || root2 == null){
            return false;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root1);
        while(!queue.isEmpty()){
            TreeNode cur = queue.poll();
            if(isSame(cur, root2)) return true;
            else{
                if(cur.left != null) queue.offer(cur.left);
                if(cur.right != null) queue.offer(cur.right);
            }
        }
        return false;
    }