一、问题解析
1. 概念
- 对称二叉树也叫镜像二叉树,我理解是以根节点为中轴线进行折叠后树中所有节点能重合,或者说以根节点为中轴线放一面镜子是不是所有节点都能跟照镜子一样进行映射。
2. 解题
- 思路1:递归。
简单讲就是从根节点开始检查左右子树,然后再检查左右子树的左右子树。
- 思路2:迭代。
用队列的思想迭代,就是从根节点砍一刀劈成两部分,按照上下顺序层序入队。
二、代码实现
1. 递归代码
class Solution {
public boolean isSymmetric(TreeNode root) {
if (root == null) return true;
return check(root.left, root.right);
}
private boolean check(TreeNode a, TreeNode b) {
if (a == null && b == null) return true;
if (a != null && b == null) return false;
if (a == null && b != null) return false;
if (a.val != b.val) return false;
boolean outside = check(a.left, b.right);
boolean inside = check(a.right, b.left);
return outside && inside;
}
}
2. 迭代代码
class Solution {
public boolean isSymmetric(TreeNode root) {
return check(root, root)
}
public boolean check(TreeNode u, TreeNode v) {
Queue<TreeNode> q = new LinkedList<TreeNode>()
q.offer(u)
q.offer(v)
while (!q.isEmpty()) {
u = q.poll()
v = q.poll()
if (u == null && v == null) {
continue
}
if ((u == null || v == null) || (u.val != v.val)) {
return false
}
q.offer(u.left)
q.offer(v.right)
q.offer(u.right)
q.offer(v.left)
}
return true
}
}
三、复杂度分析
- 递归:时间复杂度为O(n), 空间复杂度为O(n)。
- 迭代:时间复杂度为O(n), 空间复杂度为O(n)。