Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
For example, this binary tree is symmetric:
1 / \ 2 2 / \ / \ 3 4 4 3
But the following is not:
1 / \ 2 2 \ \ 3 3
Iterative solution:
/** * Definition for binary tree * 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; List<TreeNode> left = new LinkedList<TreeNode>(); List<TreeNode> right = new LinkedList<TreeNode>(); List<Integer> state = new LinkedList<Integer>(); left.add(root.left); right.add(root.right); state.add(0); int level = 0; while (level>=0){ int curState = state.get(level); TreeNode node1 = left.get(level); TreeNode node2 = right.get(level); //Newly enqueue if (curState == 0){ if (node1==null && node2==null){ state.remove(level); left.remove(level); right.remove(level); level--; continue; } if (node1==null && node2!=null) return false; if (node1!=null && node2==null) return false; if (node1.val!=node2.val) return false; //Check node1.left && node2.right. change state. state.set(level,1); left.add(node1.left); right.add(node2.right); state.add(0); level++; continue; } //Check node1.right && node2.leflt, change state. if (curState==1){ state.set(level,2); left.add(node1.right); right.add(node2.left); state.add(0); level++; continue; } //Already checked left and right subtree, backtrack. state.remove(level); left.remove(level); right.remove(level); level--; } return true; } }
Solution:
1 /** 2 * Definition for binary tree 3 * public class TreeNode { 4 * int val; 5 * TreeNode left; 6 * TreeNode right; 7 * TreeNode(int x) { val = x; } 8 * } 9 */ 10 public class Solution { 11 public boolean isSymmetric(TreeNode root) { 12 if (root==null) 13 return true; 14 15 boolean res = isSymmetricRecur(root.left,root.right); 16 17 return res; 18 } 19 20 //Determine whether the tree "left" and the tree "right" is symmetric. 21 public boolean isSymmetricRecur(TreeNode left, TreeNode right){ 22 //One is null, the other is not, then false; 23 if ((left==null && right!=null)||(left!=null&&right==null)) 24 return false; 25 26 //Both are empty, then true; 27 if (left==null&&right==null) 28 return true; 29 30 //Both are not empty, but val is not the same, then false. 31 if (left.val!=right.val) 32 return false; 33 34 //Both of them are leaf nodes 35 if (left.left==null&&left.right==null&&right.left==null&&right.right==null) 36 if (left.val==right.val) 37 return true; 38 else 39 return false; 40 41 boolean leftSym = isSymmetricRecur(left.left,right.right); 42 if (!leftSym) 43 return false; 44 45 boolean rightSym = isSymmetricRecur(left.right,right.left); 46 if (!rightSym) 47 return false; 48 49 50 return true; 51 } 52 }
This is an recursion solution. For easy solution, we can use BFS to put every node into a list orderred by level, then check whether the nodes on the same level are symmetric.
NOTE: we need consider all situation carefully. I failed several times because of missing some situations!