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