剑指Offer58:对称的二叉树(Java)
参考“hustZa”的牛客解答:https://www.nowcoder.com/questionTerminal/ff05d44dfdb04e1d83bdbdab320efbcb?f=discussion
思路分析:
1.递归 2.非递归
不管是哪种都要注意要判断一个为空另一个不为空的情况,否则会报空指针。left==null&&right!=null||left!=null&&right==null
返回false。
用队列实现非递归,就像做层序遍历,注意左右成对入队。
递归实现
public class Solution {
boolean isSymmetrical(TreeNode pRoot)
{
if(pRoot==null){
return true;
}
TreeNode left=pRoot.left;
TreeNode right=pRoot.right;
return process(left,right);
}
public static boolean process(TreeNode left,TreeNode right){
if(left==null&&right==null){
return true;
}
if(left==null&&right!=null||left!=null&&right==null){
return false;
}
boolean res=left.val==right.val?true:false;//这行代码之前要排除left或right是null,否则会报空指针
return res&&process(left.left,right.right)&&process(left.right,right.left);
}
}
非递归实现(队列)
import java.util.LinkedList;
import java.util.Queue;
public class Solution {
boolean isSymmetrical(TreeNode pRoot)
{
if(pRoot==null){
return true;
}
Queue<TreeNode> que=new LinkedList<>();
que.offer(pRoot.left);
que.offer(pRoot.right);
while(!que.isEmpty()){
TreeNode left=que.poll();
TreeNode right=que.poll();
if(left==null&&right==null){
continue;
}
if(left==null||right==null){
return false;
}
if(left.val!=right.val){
return false;
}
que.offer(left.right);//注意:入队要成对入队
que.offer(right.left);
que.offer(left.left);
que.offer(right.right);
}
return true;
}
}