标签:
树、递归、队列
题目:
给定一棵二叉树,判断其是否是自身的镜像(即:是否对称)
例如: 下面这棵二叉树是对称的
下面这棵二叉树不对称
数据范围:节点数满足 0 ≤n≤1000,节点上的值满足val∣≤1000
要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)
备注:
你可以用递归和迭代两种方法解决这个问题。
反思:
这道题目我在思考的时候想到了如何解决,但可能是由于接触到树的知识点并不多,所以知道用什么知识点来解决,但是在写代码的时候写不出来,迷迷糊糊,不知道可以将该传进来的参数再复制一份,由于是完全对称的(镜像),所以我们一份使用根左右来遍历,一份可以使用根右左来遍历。然后再方法中判断相同或者不同的条件即可。
另外至于使用队列来解决这道题目的时候,思路也是差不多的,一定要多做一做这种题目才可以应对其他的题目。
用到的知识点:
树、递归、队列
代码:
递归:
// 递归的方式
boolean recur(TreeNode pRoot1, TreeNode pRoot2){
if (pRoot1 == null && pRoot2 == null) {
return true;
}
if (pRoot1 == null || pRoot2 == null || pRoot1.val != pRoot2.val) {
return false;
}
return recur(pRoot1.left,pRoot2.right) && recur(pRoot1.right,pRoot2.left );
}
boolean isSymmetrical(TreeNode pRoot) {
return recur(pRoot,pRoot);
}
队列
// 队列
boolean isSymmetrical2(TreeNode pRoot) {
if (pRoot == null) {
return true;
}
Queue<TreeNode> q1 = new LinkedList<>();
Queue<TreeNode> q2 = new LinkedList<>();
q1.offer(pRoot.left);
q2.offer(pRoot.right);
while (!q1.isEmpty() && !q2.isEmpty()) {
TreeNode poll1 = q1.poll();
TreeNode poll2 = q2.poll();
if (poll1 == null && poll2 == null) {
continue;
}
if (poll1 == null || poll2 == null || poll1.val != poll2.val) {
return false;
}
q1.offer(poll1.left);
q1.offer(poll1.right);
q2.offer(poll2.right);
q2.offer(poll2.left);
}
return true;
}