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
参考 http://www.cnblogs.com/feiling/p/3251061.html & http://fisherlei.blogspot.com/2013/01/leetcode-symmetric-tree.html
非递归解法:按层遍历,每一层检查一下是否对称。
/** * 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; } LinkedList<TreeNode> l = new LinkedList<TreeNode>(), LinkedList<TreeNode> r = new LinkedList<TreeNode>(); l.add(root.left); r.add(root.right); while(!l.isEmpty() && !r.isEmpty()) { TreeNode t1 = l.poll(); TreeNode t2 = r.poll(); if((t1 == null && t2 != null)||(t2 == null && t1 != null)){ return false; } if( t1 != null){ if(t1.val != t2.val){ return false; } l.add(t1.left); l.add(t1.right); r.add(t2.right); r.add(t2.left); } } return true; } }
递归解法:
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 return checkSymmetric(root.left, root.right); 16 } 17 18 private boolean checkSymmetric(TreeNode left, TreeNode right){ 19 if(left == null && right == null) 20 return true; 21 22 if((left == null && right != null) || (left != null && right == null)) 23 return false; 24 25 if(left.val != right.val) 26 return false; 27 28 return checkSymmetric(left.left, right.right) && checkSymmetric(left.right, right.left); 29 } 30 }
其中左子树和右子树对称的条件:
- 两个节点值相等,或者都为空
- 左节点的左子树和右节点的右子树对称
- 左节点的右子树和右节点的左子树对称
/** * 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; else return check(root.left, root.right); } private boolean check(TreeNode left, TreeNode right){ if(left == null) return right == null; if(right == null) return left == null; if(left.val != right.val) return false; else return check(left.left, right.right) && check(left.right, right.left); } }