题目
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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
进阶:
你可以运用递归和迭代两种方法解决这个问题吗?
链接:https://leetcode-cn.com/problems/symmetric-tree
解题记录
- 递归便利root节点的两个子树,左树先访问左节点,右树先访问右节点,统计之后比对
- ps,java处理null是真的烦
/**
* @author ffzs
* @describe
* @date 2020/5/31
*/
public class Solution {
ArrayList<Integer> left = new ArrayList<>();
ArrayList<Integer> right = new ArrayList<>();
public boolean isSymmetric(TreeNode root) {
if (root==null) return true;
LTraversal(root.left);
RTraversal(root.right);
if (left.size()!=right.size()) return false;
for (int i = 0; i < left.size(); i++) {
Integer l = left.get(i);
Integer r = right.get(i);
if (l == null) {
if (r != null) return false;
} else {
if (r != null && !l.equals(r)) return false;
}
}
return true;
}
private void LTraversal (TreeNode root) {
if (root != null) {
left.add(root.val);
LTraversal(root.left);
LTraversal(root.right);
}else{
left.add(null);
}
}
private void RTraversal (TreeNode root) {
if (root != null) {
right.add(root.val);
RTraversal(root.right);
RTraversal(root.left);
}else{
right.add(null);
}
}
}
优化
- 直接在递归的过程中进行比对
/**
* @author ffzs
* @describe
* @date 2020/5/31
*/
public class Solution2 {
public boolean isSymmetric(TreeNode root) {
if (root == null) return true;
return doubleTraversal(root.left, root.right);
}
private boolean doubleTraversal (TreeNode left, TreeNode right) {
if (left == right) return true;
if (left != null && right != null) {
return left.val == right.val && doubleTraversal(left.left, right.right) && doubleTraversal(left.right, right.left);
}else{
return false;
}
}
}