/*
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 ;
}
}