/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
import java.util.* ;
public class Solution {
    //使用二叉树的层序遍历,判断每一层的序列是否对称
    boolean isSymmetrical(TreeNode pRoot) {
        if(pRoot == null) {
            return true ;
        }
        //这是空结点的 占位结点的值
        int NULL_VAL = Integer.MIN_VALUE ;
        Queue<TreeNode> que = new LinkedList<>() ;
        TreeNode cur = pRoot ;
        que.offer(cur) ;
        while(!que.isEmpty()) {
            //每次都只处理一层,记录一下本层的节点个数(包括空节点)
            int len = que.size() ;
            //申请一个零时数组,用于存放每一层结点从左到右的值的序列
            int[] temp = new int[len] ;
            int index = 0 ;
            //处理这一层
            while(len > 0) {
                cur = que.poll() ;
                len--;
                temp[index++] = cur.val ;
                //如果从队列中刚取出来的节点是 不是空节点 ,才用将它的子节点再次加入队列
                if(cur.val != NULL_VAL) {
                    //分别判断左右节点
                    //如果结点为null则创建一个空节点,代替,并加入队列
                    if(cur.left == null) {
                        que.offer(new TreeNode(NULL_VAL)) ;
                    } else {
                        que.offer(cur.left) ;
                    }
                    if(cur.right == null) {
                        que.offer(new TreeNode(NULL_VAL)) ;
                    } else {
                        que.offer(cur.right) ;
                    }
                }
            }
            //每层处理完成后,temp中存放的就是这层结点的值(从左到右)
            //只需要判断 这个数组是否对称即可
            if(!isMirror(temp)) {
                return false ;
            } 
        }
        return true ;
    }
    //判断数组元素是否对称
    boolean isMirror(int[] temp) {
        int s = 0 ;
        int e = temp.length-1 ;
        while(e > s) {
            if(temp[s] != temp[e]) {
                return false ;
            }
            e -- ;
            s ++ ;
        }
        return true ;
    }
}