/**
     * 非递归的方法
     * 分四种情况:
     * 第一种:左右儿子都为空,返回true
     * 第二种:左右儿子一者为空,另一者不为空,返回false
     * 第三种:左右儿子都不为空,但是两者的值不相等,返回false
     * 第四种:左右儿子都不为空,且两者的值相等,继续,将孩子入队
     * 采用队列的方式,每次循环出队列两个,进行上述四种情况判断
     * (注:返回true的情况不能直接返回,需要进行判断,队列为空时,才能返回)
     * 在循环时,入队的顺序要注意:
     * 由于每次出队两个,对应入队的顺序应该是镜像的位置,
     * 如结点left,right判断完之后,符合第四种情况,则入队顺序为:
     * ①queue.add(left.right);
     * ②queue.add(right.left);
     * ③queue.add(left.left);
     * ④queue.add(right.right);
     * 或者
     * ①queue.add(left.left);
     * ②queue.add(right.right);
     * ③queue.add(left.right);
     * ④queue.add(right.left);
     * 符合镜像就可以
     */
    public boolean isSymmetric(TreeNode root) {
        if(root == null)
            return true;
        Queue<TreeNode> queue = new LinkedList<>();
        if(root.left == null || root.right == null){
            if (root.left == null && root.right == null) {
                return true;
            } else {
                return false;
            }
        }
        queue.add(root.left);
        queue.add(root.right);
        while(!queue.isEmpty()){
            int size = queue.size();
            while(size > 0){
                TreeNode left = queue.poll();
                TreeNode right = queue.poll();
                size -= 2;
                if(left == null && right == null)
                    continue;
                else if (left == null || right == null) {
                    return false;
                } else if(left.val != right.val)
                    return false;
                queue.add(left.left);
                queue.add(right.right);
                queue.add(left.right);
                queue.add(right.left);
            }
        }

        return true;
    }