題目:
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
Note:
Bonus points if you could solve it both recursively and iteratively.
題解:
判斷左右子樹是否相等。
遞迴的解法:
1 public boolean isSymmetricTree(TreeNode p,TreeNode q){
2 if(p == null&&q == null)
3 return true;
4 if(p == null||q == null)
5 return false;
6 return (p.val == q.val) && isSymmetricTree(p.left, q.right) && isSymmetricTree(p.right, q.left);
7 }
8
9 public boolean isSymmetric(TreeNode root) {
10 if(root==null)
11 return true;
12
13 return isSymmetricTree(root.left,root.right);
14 }
2 if(p == null&&q == null)
3 return true;
4 if(p == null||q == null)
5 return false;
6 return (p.val == q.val) && isSymmetricTree(p.left, q.right) && isSymmetricTree(p.right, q.left);
7 }
8
9 public boolean isSymmetric(TreeNode root) {
10 if(root==null)
11 return true;
12
13 return isSymmetricTree(root.left,root.right);
14 }
非遞迴解法:
1 public boolean isSymmetric(TreeNode root) {
2 if(root == null)
3 return true;
4 if(root.left == null && root.right == null)
5 return true;
6 if(root.left == null || root.right == null)
7 return false;
8 LinkedList<TreeNode> q1 = new LinkedList<TreeNode>();
9 LinkedList<TreeNode> q2 = new LinkedList<TreeNode>();
10 q1.add(root.left);
11 q2.add(root.right);
12 while(!q1.isEmpty() && !q2.isEmpty()){
13 TreeNode n1 = q1.poll();
14 TreeNode n2 = q2.poll();
15
16 if(n1.val != n2.val)
17 return false;
18 if((n1.left == null && n2.right != null) || (n1.left != null && n2.right == null))
19 return false;
20 if((n1.right == null && n2.left != null) || (n1.right != null && n2.left == null))
21 return false;
22
23 if(n1.left != null && n2.right != null){
24 q1.add(n1.left);
25 q2.add(n2.right);
26 }
27
28 if(n1.right != null && n2.left != null){
29 q1.add(n1.right);
30 q2.add(n2.left);
31 }
32 }
33 return true;
34 }
2 if(root == null)
3 return true;
4 if(root.left == null && root.right == null)
5 return true;
6 if(root.left == null || root.right == null)
7 return false;
8 LinkedList<TreeNode> q1 = new LinkedList<TreeNode>();
9 LinkedList<TreeNode> q2 = new LinkedList<TreeNode>();
10 q1.add(root.left);
11 q2.add(root.right);
12 while(!q1.isEmpty() && !q2.isEmpty()){
13 TreeNode n1 = q1.poll();
14 TreeNode n2 = q2.poll();
15
16 if(n1.val != n2.val)
17 return false;
18 if((n1.left == null && n2.right != null) || (n1.left != null && n2.right == null))
19 return false;
20 if((n1.right == null && n2.left != null) || (n1.right != null && n2.left == null))
21 return false;
22
23 if(n1.left != null && n2.right != null){
24 q1.add(n1.left);
25 q2.add(n2.right);
26 }
27
28 if(n1.right != null && n2.left != null){
29 q1.add(n1.right);
30 q2.add(n2.left);
31 }
32 }
33 return true;
34 }
Reference:
http://blog.csdn.net/linhuanmars/article/details/23072829