描述
给定一棵二叉树,判断其是否是自身的镜像(即:是否对称)
例如: 下面这棵二叉树是对称的
下面这棵二叉树不对称。
数据范围:节点数满足 0 \le n \le 10000≤n≤1000,节点上的值满足 |val| \le 1000∣val∣≤1000
要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)
备注:
你可以用递归和迭代两种方法解决这个问题
示例1
输入:{1,2,2,3,4,4,3}
返回值:true
示例2
输入:{8,6,9,5,7,7,5}
返回值:false
第一种解法
直接将树分为左子树 和 右子树,然后循环遍历,判断对应节点是否一致即可,代码如下
public boolean firstIsSymmetrical(TreeNode pRoot) {
if(pRoot == null){
return true;
}
if(pRoot.left == null && pRoot.right == null){
return true;
}
if(pRoot.left == null || pRoot.right == null){
return false;
}
return isSame(pRoot.left,pRoot.right);
}
public boolean isSame(TreeNode leftTree, TreeNode rightTree){
if(leftTree == null && rightTree == null){
return true;
}
if(leftTree != null && rightTree != null && leftTree.val == rightTree.val){
return isSame(leftTree.left,rightTree.right) && isSame(leftTree.right,rightTree.left);
}
return false;
}
第二种解法
其实和第一种解法类似,但是不采用递归的方法,使用队列来实现,代码如下
public boolean secondIsSymmetrical(TreeNode pRoot) {
if(pRoot == null){
return true;
}
if(pRoot.left == null && pRoot.right == null){
return true;
}
if(pRoot.left == null || pRoot.right == null){
return false;
}
Queue<TreeNode> leftTree = new LinkedList<>();
Queue<TreeNode> rightTree = new LinkedList<>();
leftTree.add(pRoot.left);
rightTree.add(pRoot.right);
while (!leftTree.isEmpty() && !rightTree.isEmpty()){
TreeNode left = leftTree.poll();
TreeNode right = rightTree.poll();
if(left == null && right == null){
continue;
}
if(left == null || right == null){
return false;
}
if(left.val != right.val){
return false;
}
leftTree.add(left.left);
leftTree.add(left.right);
rightTree.add(right.right);
rightTree.add(right.left);
}
return leftTree.isEmpty() && rightTree.isEmpty();
}