给定一个二叉树,检查它是否是镜像对称的。

    递归法:1.确认返回值与输入参数:
    boolean sup(TreeNode left,TreeNode right)
    很容易可以确认输入参数是左右子树,返回值是boolean型
    2.确认终止条件:
    if(left==null&&right==null) return true;
    if(left==null||right==null) return false;
    即若是有一个子树不存在,则返回false
    3.确认递归内容
    if(left.val!=right.val) return false;
    return sup(left.left,right.right)&&sup(left.right,right.left);
    即判断左右子树是否值相等。
    注意:对称二叉树是判别左子树的左子树与右子树的右子树是否对称,是镜像的!

    迭代法:可以用双端队列,亦可以用不同队列

    使用双端队列解本题,会容易一些,思路与迭代法类似,不断往队列头部添加左子树的相关子树,往尾部添加右子树的相关子树。但注意要把握好添加的顺序,这个自己模拟一下即可
    public boolean isSymmetric(TreeNode root) {
    Deque deque = new LinkedList<>();
    if(root==null) return true;
    deque.offerFirst(root.left);
    deque.offerLast(root.right);
    while(!deque.isEmpty()){
    TreeNode left = deque.pollFirst();
    TreeNode right = deque.pollLast();
    if(left==null&&right==null) continue;
    if(left==null||right==null) return false;
    if(left.val!=right.val) return false;
    deque.offerFirst(left.left);
    deque.offerFirst(left.right);
    deque.offerLast(right.right);
    deque.offerLast(right.left);
    }
    return true;
    }

    单队列:方法与双端队列类似,区别在于队列放入顺序上边稍微复杂了一些。

    public boolean isSymmetric(TreeNode root) {
    Queue queue = new LinkedList<>();
    if(root==null) return true;
    queue.offer(root.left);
    queue.offer(root.right);
    while(!queue.isEmpty()){
    TreeNode left = queue.poll();
    TreeNode right = queue.poll();
    if(left==null&&right==null) continue;
    if(left==null||right==null) return false;
    if(left.val!=right.val) return false;
    queue.offer(left.left);
    queue.offer(right.right);
    queue.offer(left.right);
    queue.offer(right.left);
    }
    return true;
    }