题目的链接在这里:https://www.nowcoder.com/practice/ff05d44dfdb04e1d83bdbdab320efbcb
- 题目大意
- 一、示意图
- 二、解题思路
- 错误示范
- 递归
题目大意 请实现一个函数,用来判断一棵二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
一、示意图 二、解题思路
错误示范和递归错误示范
代码如下:
import java.util.*;
public class Solution {
boolean isSymmetrical(TreeNode pRoot) {
//直接中序遍历 然后判断就行了
//或者层次遍历 先判断一层的长度是不是2的倍数 然后再判断这几个是不是对称的、然后他们对称的话 利用那个数据结构 不能存一样的 应该就大小变成了size的一半?
//先进行一些边界判断
if(pRoot==null)
return true;
if(pRoot.left==null&&pRoot.right==null)
return true;
//需要排除第一个
if((pRoot.left==null&&pRoot.right!=null)||(pRoot.right==null&&pRoot.left!=null)){
return false;
}
//然后之后的pRoot就是既有左子树 又有右子树了
Queue queue=new linkedList<>();
queue.add(pRoot.left);
queue.add(pRoot.right);
int size;
//使用这个来存储当前层的值
HashSet hashSet =new HashSet<>();
//然后开始判断
while (!queue.isEmpty()){
//每次都要清空一下 没有这个判断会报错的
if(!hashSet.isEmpty()){
hashSet.clear();
}
size=queue.size();
//开始判断
if(size%2!=0){
//说明是单数
return false;
}
//然后开始判断
for(int i=0;i
递归
代码如下:
import java.util.*;
public class Solution {
boolean isSymmetrical(TreeNode pRoot) {
//直接中序遍历 然后判断就行了
//或者层次遍历 先判断一层的长度是不是2的倍数 然后再判断这几个是不是对称的、然后他们对称的话 利用那个数据结构 不能存一样的 应该就大小变成了size的一半?
//先进行一些边界判断
if(pRoot==null)
return true;
if(pRoot.left==null&&pRoot.right==null)
return true;
//需要排除第一个
if((pRoot.left==null&&pRoot.right!=null)||(pRoot.right==null&&pRoot.left!=null)){
return false;
}
//那 中序后序这些遍历 也都实现不了这个 {5,5,5,5,#,#,5,5,#,5}
//使用递归的方法
return comBa(pRoot.left,pRoot.right);
}
private boolean comBa(TreeNode left, TreeNode right) {
if(left==null){
//那就判断他右边存不存在
return right==null;
}
//然后就是说明他左边是存在的
if(right==null)
return false;
//然后就是判断这两个一不一样
if(left.val!=right.val)
return false;
//然后就是这个位置是相同的 开始递归其他位置
return comBa(left.left,right.right)&&comBa(left.right,right.left);
}
}


![java 剑指offer之[数据结构 困难]JZ58 对称的二叉树 java 剑指offer之[数据结构 困难]JZ58 对称的二叉树](http://www.mshxw.com/aiimages/31/318519.png)
