题目
给定一棵二叉树,判断其是否是自身的镜像(即:是否对称)
例如:下面这棵二叉树是对称的:
下面这棵二叉树不对称:
数据范围:节点数满足0≤n≤1000,节点上的值满足∣val∣≤1000
要求:空间复杂度 O(n),时间复杂度 O(n)
备注:你可以用递归和迭代两种方法解决这个问题
示例1
输入:{1,2,2,3,4,4,3}
返回值:true
示例2
输入:{8,6,9,5,7,7,5}
返回值:false
思路1:递归
代码1
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
boolean isSymmetrical(TreeNode pRoot) {
if(pRoot == null) {
return true;
}
return isMirror(pRoot.left, pRoot.right);
}
private boolean isMirror(TreeNode left, TreeNode right) {
if(left == null && right == null) {
return true;
}
if(left == null || right == null) {
return false;
}
if(left.val != right.val) {
return false;
}
//这三个if判断不可以写成pRoot.left和pRoot.right放在上面的方法中
//因为那样的话只能判断当前节点,左右子树就判断不到了
return isMirror(left.left, right.right) && isMirror(left.right, right.left);
}
}
思路2:迭代 队列 层序遍历
代码2
import java.util.*;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
boolean isSymmetrical(TreeNode pRoot) {
if(pRoot == null || (pRoot.left == null && pRoot.right == null)) {
return true;
}
//使用队列存储每一层需要判断对称的节点
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(pRoot.left);
queue.offer(pRoot.right);
while(!queue.isEmpty()) {
//每次取出一组元素(左树和右树的根)
TreeNode left = queue.poll();
TreeNode right = queue.poll();
//判空
if(left == null && right == null) {
continue;
}
if(left == null || right == null) {
return false;
}
if(left.val != right.val) {
return false;
}
//将当前左右子树的根节点判断完毕,将left.left和right.right入队,将left.right和right.left入队
queue.offer(left.left);
queue.offer(right.right);
queue.offer(left.right);
queue.offer(right.left);
}
return true;
}
}