Thinking process
Iterative solution
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public boolean isSymmetric(TreeNode root) {
if (root == null) return true;
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
int size = queue.size();
List<Integer> level = new ArrayList<>();
for (int i = 0; i < size; ++i) {
TreeNode node = queue.poll();
if (node.left != null) {
queue.offer(node.left);
level.add(node.left.val);
} else {
level.add(0);
}
if (node.right != null) {
queue.offer(node.right);
level.add(node.right.val);
} else {
level.add(0);
}
}
if (!checkLevel(level)) {
return false;
}
}
return true;
}
private boolean checkLevel(List<Integer> list) {
int i = 0, j = list.size() - 1;
while (i <= j) {
if (list.get(i) != list.get(j)) {
return false;
}
i++;
j--;
}
return true;
}
}
/////////////////////////////////////2////////////////////////////////////////
public class Solution {
public boolean isSymmetric(TreeNode root) {
if (root == null) return true;
Queue<TreeNode> queue1 = new LinkedList<>();
Queue<TreeNode> queue2 = new LinkedList<>();
queue1.offer(root.left);
queue2.offer(root.right);
while (!queue1.isEmpty() && !queue2.isEmpty()) {
TreeNode node1 = queue1.poll();
TreeNode node2 = queue2.poll();
if (node1 == null && node2 == null) continue;
if (node1 == null || node2 == null) return false;
if (node1.val != node2.val) return false;
queue1.offer(node1.left);
queue2.offer(node2.right);
queue1.offer(node1.right);
queue2.offer(node2.left);
}
return queue1.isEmpty() && queue2.isEmpty();
}
}
Recursion
public class Solution {
public boolean isSymmetric(TreeNode root) {
if (root == null) return true;
return isSubTreeSymmetric(root.left, root.right);
}
private boolean isSubTreeSymmetric(TreeNode left, TreeNode right) {
if (left == null || right == null) {
return left == right;
} else {
if (left.val != right.val) return false;
}
return isSubTreeSymmetric(left.left, right.right) && isSubTreeSymmetric(left.right, right.left);
}
}
////////////////////////////////////////////////2///////////////////////////////////////////
public class Solution {
public boolean isSymmetric(TreeNode root) {
if (root == null) return true;
return isSymmetricDfsHelper(root.left, root.right);
}
//compare node1 and node 2
//return true, if node1.val == node2.val and node1.left.val == node2.right.val and node1.right.val == node2.left.val
//else return false
private boolean isSymmetricDfsHelper(TreeNode node1, TreeNode node2) {
if (node1 == null && node2 == null) return true;
if (node1 == null || node2 == null) return false;
return node1.val == node2.val && isSymmetricDfsHelper(node1.left, node2.right) && isSymmetricDfsHelper(node1.right, node2.left);
}
}
Follow up: what if there are three children of each node, left, mid and right?
- use the level order traversal solution iteratively