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.
分析: 写代码的时候感觉有点绕,第一个节点root没什么好判断的,递归也好,迭代也好,真正把树分成两半去比较都是从root.left 和 root.right 开始的, 然后就是 root.left.left & root.right.right, root.left.right & root.right.left
Iteratively:
/**
* 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;
}
LinkedList<TreeNode> queuel = new LinkedList<>();
LinkedList<TreeNode> queuer = new LinkedList<>();
if(root.left != null){
queuel.offer(root.left);
}
if(root.right != null){
queuer.offer(root.right);
}
if(queuel.size() != queuer.size()){
return false;
}
while(!queuel.isEmpty() && !queuer.isEmpty()){
int sizel = queuel.size();
int sizer = queuer.size();
if(sizel != sizer){
return false;
}
for(int i = 0; i < sizel; i++){
TreeNode l = queuel.poll();
TreeNode r = queuer.poll();
if(l.val != r.val){
return false;
}
if(l.left != null){
if(r.right == null){
return false;
}
queuel.offer(l.left);
queuer.offer(r.right);
}else{
if(r.right != null){
return false;
}
}
if(l.right != null){
if(r.left == null){
return false;
}
queuel.offer(l.right);
queuer.offer(r.left);
}else{
if(r.left != null){
return false;
}
}
}
}
return true;
}
}
recursively:
/**
* 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;
}
return isSymmetric(root.left, root.right);
}
private boolean isSymmetric(TreeNode root1, TreeNode root2){
if(root1 == null && root2 == null){
return true;
}
if(root1 == null || root2 == null){
return false;
}
if(root1.val != root2.val){
return false;
}
return isSymmetric(root1.left, root2.right) && isSymmetric(root1.right, root2.left);
}
}