描述
给定一棵二叉树,判断其是否是自身的镜像(即:是否对称)
例如: 下面这棵二叉树是对称的
下面这棵二叉树不对称。
数据范围:节点数满足 0≤n≤1000,节点上的值满足 0∣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:递归
/*
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) {
return isSymmetrical(pRoot,pRoot);
}
boolean isSymmetrical(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;
}
return isSymmetrical(left.left,right.right) && isSymmetrical(left.right,right.left);
}
}
解法2:迭代
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
import java.util.*;
public class Solution {
boolean isSymmetrical(TreeNode pRoot) {
if(pRoot ==null)
return true;
// 创建左右子树
TreeNode left,right;
// 创建两个队列
Queue<TreeNode> q1 = new LinkedList<TreeNode>();
Queue<TreeNode> q2 = new LinkedList<TreeNode>();
// 先把左子树放入q1,右子树放入q2
q1.offer(pRoot.left);
q2.offer(pRoot.right);
while(!q1.isEmpty() && !q2.isEmpty()){
left = q1.poll();
right = q2.poll();
// 如果两边为空则continue
if(left == null && right == null)
continue;
if(left == null || right == null)
return false;
if(left.val != right.val)
return false;
//q1先存左再存右
q1.offer(left.left);
q1.offer(left.right);
//q2先存右再存左
q2.offer(right.right);
q2.offer(right.left);
}
// 如果while循环都不会返回false,则返回true
return true;
}
}