题目链接: https://leetcode.cn/problems/dui-cheng-de-er-cha-shu-lcof/
我们可以实现这样一个递归函数,通过「同步移动」两个指针的方法来遍历这棵树,pp 指针和 qq 指针一开始都指向这棵树的根,随后 pp
右移时,qq 左移,pp 左移时,qq 右移。每次检查当前 pp 和 qq 节点的值是否相等,如果相等再判断左右子树是否对称。
import java.util.LinkedList;
import java.util.Queue;
public class Solution {
public boolean isSymmetric(TreeNode root) {
return Check(root,root);//BFS
//方法一 return Judge(root,root);//DFS
}
boolean Check(TreeNode p,TreeNode q){
Queue<TreeNode>queue=new LinkedList<>();
queue.add(p);
queue.add(q);
while(!queue.isEmpty()){
TreeNode newp=queue.poll();
TreeNode newq=queue.poll();
if(newq==null&&newp==null)
continue; //注意不能直接返回,得等比较完所有节点
if(newq==null||newp==null||newp.val!=newq.val)
return false;
queue.add(newp.left);
queue.add(newq.right);
//对称比较插入left与right对比
queue.add(newp.right);
queue.add(newq.left);
}
return true;
}
//方法一
boolean Judge(TreeNode p,TreeNode q){
if(p==null&&q==null) return true;// 注意下面还会递归调用,和上面continue对比
if(p==null||q==null) return false;
return p.val==q.val&&Judge(p.left,q.right)&&Judge(p.right,q.left);
}
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
}