题目
级别: 简单
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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
进阶:
你可以运用递归和迭代两种方法解决这个问题吗?
思路
失败的第一次尝试:
-
好吧,拿到题目的第一时间,我的想法是观察二叉树顺序遍历的数组,发现了一些特征
- 二叉数的层级(高度),每层(包含null)的数量为2的n次方
- 想办法拿到每一层的值数组
- 查看这个一维数组是否对称
- 找到第一个不对称的false返回或者遍历完返回true
-
思考了半天,参考了一些很奇怪的东西,决定使用
LinkedList,借用队列的特性,不断的遍历数,直到得到足够大小的list,list.size()=2,4,8,16...,判断这个list是否对称并清空 -
想法很美好,现实很残酷
[3,4,4,5,null,null,5,6,null,null,6] 3 4 4 5 n n 5 6 n n 6一个这样的二叉树,在遍历过程中,发现实在是有点难以填充null,最终放弃
第二次尝试:
-
继续观察树的特征,有其实上面的那个树
-
发现从根节点开始,左右对称
-
所以分解问题,根节点左右子树对称
-
递归遍历左右节点的child,判断是否对称
即check(left.left, right.right) && check(left.right, right.left)
左子树的左子树和右子树的右子树是否相等 &&
左子树的右子树和右子树的左子树是否相等
-
不等就返回false,全等最终返回true
code
class Solution {
public boolean isSymmetric(TreeNode root) {
TreeNode left = root.left;
TreeNode right = root.right;
return check(left, right);
}
private boolean check(TreeNode left, TreeNode right) {
if (left == null && right == null) {
return true;
}
if (left == null || right == null) {
return false;
}
boolean b = left.val == right.val;
if(!b){
return b;
}
return check(left.left, right.right) && check(left.right, right.left);
}
public static class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {
}
TreeNode(int val) {
this.val = val;
}
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
public static void main(String[] args) {
//[2,3,3,4,5,5,4,null,null,8,9,null,null,9,8]
Solution solution = new Solution();
TreeNode treeNode = new TreeNode(3);
treeNode.left = new TreeNode(4);
treeNode.right = new TreeNode(4);
treeNode.left.left = new TreeNode(5);
treeNode.right.right = new TreeNode(5);
treeNode.left.left.left = new TreeNode(6);
treeNode.right.right.right = new TreeNode(6);
System.out.println(solution.isSymmetric(treeNode));
}
}
截图
- 本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情