题目
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
说明:
- 如果你可以运用递归和迭代两种方法解决这个问题,会很加分。
解答
解法一:递归
本题是 Leetcode 100. 相同的树 的变种题。
Leetcode 100. 相同的树 可看我上篇博客:上篇博客。
本题递归思路:
- 如果当前值不相等,结束。
- 否则因为为镜像树,所以需要递归 (n1.left, n2.right) 以及 (n1.right, n2.left)。
代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root == null) return true;
return isSymmetric(root.left, root.right);
}
private boolean isSymmetric(TreeNode n1, TreeNode n2) {
if(n1 == null) return n2 == null;
if(n2 == null) return n1 == null;
return n1.val == n2.val && isSymmetric(n1.left, n2.right) && isSymmetric(n1.right, n2.left);
}
}
结果
解法二:队列 + 迭代
这道题和 Leetcode 100. 相同的树 没有太大区别,只是稍微变化了一点。
同样的方法可以解决本题。
详情见:上篇博客。
代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
class Couple {
TreeNode n1;
TreeNode n2;
Couple(TreeNode n1, TreeNode n2) {
this.n1 = n1;
this.n2 = n2;
}
}
public boolean isSymmetric(TreeNode root) {
if(root == null) return true;
LinkedList<Couple> queue = new LinkedList<>();
queue.offer(new Couple(root.left, root.right));
while(!queue.isEmpty()) {
Couple top = queue.poll();
TreeNode n1 = top.n1;
TreeNode n2 = top.n2;
if(!equals(n1, n2)) return false;
if(n1 != null && n2 != null) {
queue.offer(new Couple(n1.left, n2.right));
queue.offer(new Couple(n1.right, n2.left));
}
}
return true;
}
private boolean equals(TreeNode p, TreeNode q) {
if(p == null) return q == null;
if(q == null) return p == null;
return p.val == q.val;
}
}