题目
截图自官方
代码
笔记:注意自己解法的问题;注意递归方法;注意解法2 迭代法,将递归改为遍历的常用手法就是使用一个队列。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
// 试了下这种中序遍历,然后判断字符串是否回文。但是[1,2,2,2,null,2]不是镜像的,但是生成的字符串是回文的。因此不行。镜像二叉树的中序遍历一定回文,但是非镜像的中序便利也可能回文。
// StringBuilder的使用一定要注意。
// StringBuilder.reverse()直接改变了自身,虽然该方法有StringBuilder返回值,但是也仅仅是改变后的对象的引用(本身和返回值都指向的反转后的)。
// 而且StringBuilder的equal方法没有复写,只是比较地址是否相等
// List<Integer> l=new ArrayList();
// public boolean isSymmetric(TreeNode root) {
// inorder(root);
// StringBuilder s=new StringBuilder();
// for(int i=0;i<l.size();i++){
// s.append(l.get(i));
// }
// String q=s.toString();
// StringBuilder b=s.reverse();
// return q.equals(b.toString());
// }
// public void inorder(TreeNode root){
// if(root!=null){
// inorder(root.left);
// l.add(root.val);
// inorder(root.right);
// }
// }
// 解法1.递归,为了防止重复比较,传入root.left,root.right
// public boolean isSymmetric(TreeNode root) {
// if(root==null){
// return true;
// }
// return check(root.left,root.right);
// }
// public boolean check(TreeNode l,TreeNode r){
// if(l==null&&r==null){
// return true;
// }
// if(l==null||r==null){
// return false;
// }
// return l.val==r.val && check(l.left,r.right)&&check(l.right,r.left);
// }
// 解法2 迭代,将递归改为遍历的常用手法就是使用一个队列
public boolean isSymmetric(TreeNode root) {
// 这个好像不允许放入空元素
// Queue queue=new ArrayDeque();
if(root==null){
return true;
}
return check(root.left,root.right);
}
public boolean check(TreeNode f,TreeNode s){
// LinkedList可以放入空元素,也可以取出来
Queue<TreeNode> queue=new LinkedList();
queue.offer(f);
queue.offer(s);
while(!queue.isEmpty()){
f=queue.poll();
s=queue.poll();
if(f==null&&s==null){
continue;
}
if(f==null||s==null||f.val!=s.val){
return false;
}
queue.offer(f.left);
queue.offer(s.right);
queue.offer(f.right);
queue.offer(s.left);
}
return true;
}
}