例如: 下面这棵二叉树是对称的
下面这棵二叉树不对称。
  数据范围:节点数满足  ,节点上的值满足
,节点上的值满足  
  
   要求:空间复杂度 ) ,时间复杂度
,时间复杂度 ) 
  
   备注: 
 你可以用递归和迭代两种方法解决这个问题
                                        递归和迭代方法实现:
递归方法:
    public boolean isSymmetrical (TreeNode pRoot) {
        // write code here
        if (pRoot == null){
            return true;
        }
        return compareTree(pRoot.left,pRoot.right);
    }
    private boolean compareTree(TreeNode left, TreeNode right) {
        if (left == null && right == null){
            return true;
        }
        if (left == null || right == null){
            return false;
        }
        if (left.val != right.val){
            return false;
        }
        return compareTree(left.left,right.right) &&compareTree(left.right,right.left);
    }
  迭代方法实现
    public boolean isSymmetrical2 (TreeNode pRoot) {
        // write code here
        if (pRoot == null){
            return true;
        }
        Stack<TreeNode> stackLeft = new Stack<>();
        Stack<TreeNode> stackRight = new Stack<>();
        stackLeft.push(pRoot.left);
        stackRight.push(pRoot.right);
        while (!stackLeft.isEmpty() && !stackRight.isEmpty()){
            TreeNode left = stackLeft.pop();
            TreeNode right = stackRight.pop();
            if (left == null && right == null){
                continue;
            }
            if (left == null || right == null){
                return false;
            }
            if (left.val != right.val){
                return false;
            }
            stackLeft.push(left.right);
            stackLeft.push(left.left);
            stackRight.push(right.left);
            stackRight.push(right.right);
        }
        return true;
    } import java.util.*;
/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 *   public TreeNode(int val) {
 *     this.val = val;
 *   }
 * }
 */
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param pRoot TreeNode类
     * @return bool布尔型
     */
    public boolean isSymmetrical (TreeNode pRoot) {
        // write code here
        LinkedList<TreeNode> queue  = new LinkedList<>();
        // 根节点为空或者只有一个根节点返回true
        if (pRoot == null || pRoot != null && pRoot.left == null &&
                pRoot.right == null ) {
            return true;
        }
        if (pRoot != null) {
            boolean pl = this.exists(pRoot.left);
            boolean pr = this.exists(pRoot.right);
            if (pl && pr && pRoot.left.val == pRoot.right.val) {
                queue.push(pRoot.left);
                queue.push(pRoot.right);
            } else {
                return false;
            }
        }
        TreeNode left;
        TreeNode right;
        while (!queue.isEmpty()) {
            left = queue.poll();
            right = queue.poll();
            boolean ll = this.exists(left.left);
            boolean lr = this.exists(left.right);
            boolean rl = this.exists(right.left);
            boolean rr = this.exists(right.right);
            if (ll && rr || !ll && !rr) {
                if (ll) {
                    if (left.left.val == right.right.val) {
                        queue.add(left.left);
                        queue.add(right.right);
                    } else {
                        return false;
                    }
                }
            } else {
                return false;
            }
            if ( lr && rl || !lr && !rl) {
                if (lr ) {
                    if (left.right.val == right.left.val) {
                        queue.add(left.right);
                        queue.add(right.left);
                    } else {
                        return false;
                    }
                }
            } else {
                return false;
            }
        }
        return true;
    }
    private boolean exists(TreeNode node) {
        return node != null;
    }
} public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param pRoot TreeNode类 
     * @return bool布尔型
     */
    boolean b=true;
    public boolean isSymmetrical (TreeNode pRoot) {
        // write code here
        if(pRoot==null)
            return true;
        a(pRoot.left,pRoot.right);
        return b;
    }
    public void a(TreeNode left,TreeNode right){
        if(left==null&&right==null)
            return;
        if(left==null||right==null){
             b=false;
             return;
        }
        if(left.val!=right.val){
             b=false;
             return;
        }      
        a(left.left,right.right);
        a(left.right,right.left);
    }
} //思路:对称及子树的左子树等于子树的右子树
     public boolean isSame(TreeNode r1,TreeNode r2) {
        if(r1==null&&r2==null) {
            return true;
        }
        if(r1==null||r2==null) {
            return false;
        }
        if(r1.val!=r2.val) {
            return false;
        }
        //让r1的左与r2的右进行比较,r1的右与r2的左进行比较
        return isSame(r1.left,r2.right)&&isSame(r1.right,r2.left);
     }
    public boolean isSymmetrical (TreeNode pRoot) {
        if(pRoot==null) {
            return true;
        }
        return isSame(pRoot.left,pRoot.right);
    } public boolean isSymmetrical (TreeNode pRoot) {
        if(pRoot==null) return true;
        boolean ans=build(pRoot.left,pRoot.right);
        return ans;
    }
    public boolean build(TreeNode left,TreeNode right){
        if(left==null&&right==null) return true;
        if(left==null&&right!=null) return false;
        if(left!=null&&right==null) return false;
        if(left.val!=right.val) return false;
        
        boolean leftB=build(left.left,right.right);
        boolean rightB=build(left.right,right.left);
        return leftB&&rightB;
    } import java.util.*;
/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;
    public TreeNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
    boolean isSymmetrical(TreeNode pRoot) {
        if (pRoot == null) {
            return true;
        }
        return isSymmetrical(pRoot.left, pRoot.right);
    }
    private boolean isSymmetrical(TreeNode left, TreeNode right) {
        if (left == null) {
            return right == null;
        }
        if (right == null) {
            return false;
        }
        if (left.val != right.val) {
            return false;
        }
        return isSymmetrical(left.left, right.right) &&
               isSymmetrical(left.right, right.left);
    }
}
 public class Solution {
    boolean isSymmetrical(TreeNode pRoot) {
        // 非空验证
        if(pRoot == null)  return true;
        // 开始递归查找
        return  isSymmetrical1(pRoot.left, pRoot.right);
    }
    boolean isSymmetrical1(TreeNode left, TreeNode right) {
        // 左,右都为null则返回true
        if(left == null && right == null) return true;
        
        // 只有一个为null,就返回false
        else if(left == null || right == null)  return false;
        
        // 两个值 不相等 则返回false
        else if(left.val != right.val) return false;
        
        // 运行到此,说明当前两个节点的值相等
        
        // 下面分别左右递归 查找子节点是否相等,必须左右都返回true,否则false
        return isSymmetrical1(left.left, right.right) && isSymmetrical1(left.right, right.left);
    }
} /*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;
    public TreeNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
    boolean isSymmetrical(TreeNode pRoot) {
        if (pRoot == null || (pRoot.left == null && pRoot.right == null))
            return true;
        if (pRoot != null && (pRoot.left == null || pRoot.right == null))
            return false;
        if (pRoot.left.val != pRoot.right.val) {
            return false;
        } else {
            return help(pRoot.left, pRoot.right);
        }
    }
    boolean help(TreeNode left, TreeNode right) {
        if (left == null && right == null)
            return true;
        if (left == null || right == null)
            return false;
        if (left.val == right.val)
            return help(left.left, right.right) && help(left.right, right.left);
        return false;
    }
}
 public class Solution {
    boolean isSymmetrical(TreeNode root) {
        if(root == null) return true;
        return dfs(root.left, root.right);
    }
    boolean dfs(TreeNode root1, TreeNode root2){
        if(root1== null && root2 == null) return true;
        if(root1 == null || root2 == null) return false;
        
        return root1.val == root2.val && dfs(root1.left, root2.right) && dfs(root1.right, root2.left);
    }
} import java.util.*;
/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;
    public TreeNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
    boolean isSymmetrical(TreeNode pRoot) {
        if (pRoot == null) return true;
        return judge(pRoot.left, pRoot.right);
    }
    public boolean judge(TreeNode left, TreeNode right) {
        if (left == null && right == null) return true;
        if (left == null || right == null || left.val != right.val) return false;
        return judge(left.left, right.right) && judge(left.right, right.left);
    }
} 
/*思路:首先根节点以及其左右子树,左子树的左子树和右子树的右子树相同 * 左子树的右子树和右子树的左子树相同即可,采用递归 * 非递归也可,采用栈或队列存取各级子树根节点 */ public class Solution { boolean isSymmetrical(TreeNode pRoot) { if(pRoot == null){ return true; } return comRoot(pRoot.left, pRoot.right); } private boolean comRoot(TreeNode left, TreeNode right) { // TODO Auto-generated method stub if(left == null) return right==null; if(right == null) return false; if(left.val != right.val) return false; return comRoot(left.right, right.left) && comRoot(left.left, right.right); } }