题目
 
给定一个二叉树,检查它是否是镜像对称的。
 
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
 
    1
   / \
  2   2
 / \ / \
3  4 4  3
 
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
 
    1
   / \
  2   2
   \   \
   3    3
 
说明:
 
如果你可以运用递归和迭代两种方法解决这个问题,会很加分。
 
递归的思路
 
很容易想到:
 
如果两个树的根节点都为空,返回true如果两个树A、B的根节点都不为空,并且值相等,等可以递归判断A.left 和 B.right以及A.right 和 B.left否则(两个根节点只有一个为空,或者值不相等)就返回false 
递归代码:
 
class Solution {
    public boolean isSymmetric(TreeNode root
) {
        if(root 
== null
) return true;
        return fun(root
.left
, root
.right
);
        
    }
    
    public boolean fun(TreeNode left
, TreeNode right
){
        if(left 
== null 
&& right 
== null
) return true;
        
        if(left 
!= null 
&& right 
!= null 
&& left
.val 
== right
.val 
){
            return fun(left
.left
,right
.right
) && fun(left
.right
,right
.left
);
        }
        else return false;
        
    }
}
 
迭代的思路
 
使用队列,判断两个连续的值是否相同开始存了两次root的值,后来存的就是对称位置的值当判断poll出来的两个都为空时,应该是continue,而不是返回true队列初始化:Queue<TreeNode> queue = new LinkedList<>();,后面的不是queue判断队列是否为空,不是用null,而是isEmpty() 
迭代的代码
 
class Solution {
    public boolean isSymmetric(TreeNode root
) {
        if(root 
== null
) return true;
        Queue
<TreeNode> queue 
= new LinkedList<>();
        queue
.add(root
);
        queue
.add(root
);
        while(!queue
.isEmpty()){
            TreeNode x 
= queue
.poll();
            TreeNode y 
= queue
.poll();
            if(x 
== null 
&& y 
== null
) continue;
            if(x 
!=null 
&& y 
!= null 
&& x
.val 
== y
.val
){
                queue
.add(x
.left
);
                queue
.add(y
.right
);
                queue
.add(x
.right
);
                queue
.add(y
.left
);
            }
            else return false;
        }
        return true;
        
    }
    
    
}