/**
* 非递归的方法
* 分四种情况:
* 第一种:左右儿子都为空,返回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;
}