给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
1
/ \
2 2
/ \ / \
3 4 4 3
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
1
/ \
2 2
\ \
3 3
说明:
如果你可以运用递归和迭代两种方法解决这个问题,会很加分。
- 解法一;递归
class Solution {
public boolean isSymmetric(TreeNode root) {
//递归版本
if(root==null) return true;
return isSymmetric(root.left,root.right);
}
public boolean isSymmetric(TreeNode root1,TreeNode root2){
//都为空
if(root1 == null && root2 == null)
return true;
if(root1 == null||root2 == null)//有一个为NULL
return false;
//如果两个不为空,比较值大小
if(root1.val!=root2.val) return false;
return isSymmetric(root1.left,root2.right)&&isSymmetric(root1.right,root2.left);
}
}
解法二;非递归
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root==null) return true;
Stack<TreeNode> s1 = new Stack<TreeNode>();
Stack<TreeNode> s2 = new Stack<TreeNode>();
TreeNode l = root.left;
TreeNode r = root.right;
while(l!=null || r!=null || s1.size()>0 || s2.size()>0){
while(l!=null&&r!=null){//当l r 同时存在
s1.push(l);l=l.left;
s2.push(r);r=r.right;
}
if(l!=null||r!=null) return false;
//此时l 和 r 都为空
l = s1.pop();
r = s2.pop();
if(l.val!=r.val) return false;
l = l.right;
r = r.left;
}
return true;
}
}