一、题目描述
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
the following [1,2,2,null,3,null,3] is not symmetric:
1
/ \
2 2
\ \
3 3
二、题解
方法一:队列迭代
别人都说递归容易,对于这题,我觉得用迭代更加简单。由于对称树是二叉的,所以,队列中每两个连续的结点必然相等的。
- 每次我们只需添加每个结点的左右孩子结点。
- 有可能孩子两个连续的结点都是空的,所以这种情况不必继续判断。下面就判断对称二叉树的性质即可:
- 两个结点要么全空,不能只空一个。
- 两个根结点都不空时应该具有相同的 val。
public boolean isSymmetric1(TreeNode root) {
LinkedList<TreeNode> queue = new LinkedList<>();
queue.add(root);
queue.add(root);
while (!queue.isEmpty()) {
TreeNode n1 = queue.poll();
TreeNode n2 = queue.poll();
if (n1 == null && n2 == null) continue;
if (n1 == null || n2 == null) return false;
if (n1.val != n2.val) return false;
queue.add(n1.left);
queue.add(n2.right);
queue.add(n1.right);
queue.add(n2.left);
}
return true;
}
复杂度分析
- 时间复杂度: ,
- 空间复杂度: ,
方法二:递归
按照递归三部曲,我们应该这样做:
方法结束条件:
- 都为空指针则返回 true
返回值:
- 只有一个为空则返回 false
本层递归的责任:
- 判断结点 1 的右子树与结点 2 的左子树是否对称
- 判断结点 1 的左子树与结点 2 的右子树是否对称
public boolean isSymmetric(TreeNode root) {
if (root == null)
return true;
return isMirror(root.left, root.right);
}
private boolean isMirror(TreeNode l, TreeNode r) {
if (l == null && r == null)
return true;
if (l == null || r == null)
return false;
return l.val == r.val &&
isMirror(l.left, r.right) && isMirror(l.right, r.left);
}
复杂度分析
- 时间复杂度: ,
- 空间复杂度: ,