剑指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 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;
}
}

猜你喜欢

转载自www.cnblogs.com/dongmm031/p/12322182.html