第一种解题思路:直接层序遍历,每层都应该是对称的整棵树才是对称的二叉树,这里注意的是有的左孩子为空,右孩子不为空导致判断起来比较麻烦而且容易出错,我们这里用了临时节点(1001),因为题目说了正常节点值的绝对值小于等于1000。时间复杂度O(N),空间复杂度O(N)
import java.util.*;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
boolean isSymmetrical(TreeNode pRoot) {
if (pRoot == null) {
return true;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(pRoot);
while (!queue.isEmpty()) {
int size = queue.size();
//除了第一行节点为奇数,其余必须均是偶数
if (size > 1 && (size & 1) == 1) {
return false;
}
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < size; i++) {
TreeNode node = queue.poll();
list.add(node.val);
if (node.val != 1001) {
if (node.left != null) {
queue.offer(node.left);
} else {
queue.offer(new TreeNode(1001));
}
if (node.right != null) {
queue.offer(node.right);
} else {
queue.offer(new TreeNode(1001));
}
}
}
if (!check(list)) {
return false;
}
}
//list为偶数一定不对称,因为跟节点只有一个,对称的二叉树list.size()一定是奇数
return true;
}
private boolean check(ArrayList<Integer> list) {
int size = list.size();
for (int i = 0; i < size / 2; i++) {
if (!list.get(i).equals(list.get(size - i - 1))) {
return false;
}
}
return true;
}
}
第二种方法:感觉上面的层序遍历是不是很麻烦,下面这种方法用的是递归,看起来还是比较好理解的。时间复杂度O(N),空间复杂度O(N)
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
boolean isSymmetrical(TreeNode pRoot) {
if (pRoot == null) {
return true;
}
return check(pRoot, pRoot);
}
//该方法是检查左右两个子树是否对称
private boolean check(TreeNode root1, TreeNode root2) {
if (root1 == null && root2 == null) {
return true;
}
if (root1 == null || root2 == null || root1.val != root2.val) {
return false;
}
return check(root1.left, root2.right) && check(root1.right, root2.left);
}
}