1.题目描述:
给你一个二叉树的根节点 root
, 检查它是否轴对称。
示例一:
示例二:
提示:
解法一:递归
二叉树是镜像对称即:
1.根相等
2.一棵树的左子树与另一棵树的右子树镜像对称
递归的思路如下:
我们可以实现一个递归函数,使用两个指针同步移动,不妨定义两个指针为p,q。p向左移动时,q指针向右移动,p向右移动时,q向左移动。移动时:
1.p == null && q == null 则 return true; 2.p == null || q == null 则 return false; 3.p.val == q.val 则 递归调用:p想向左,q向右;p向右,q向左 否则 return false;
java实现代码如下:
public boolean isSymmetric(TreeNode root) {
return check(root, root);
}
public boolean check(TreeNode p, TreeNode q) {
if (p == null && q == null) {
return true;
}
if (p == null || q == null) {
return false;
}
return p.val == q.val && check(p.right, q.left) && check(p.left, q.right);
}
解法二:迭代
解法一是递归方法,我们也可以通过引入队列使用迭代方法解决这个问题。
首先我们把树的根节点加入到队列两次,当队列不为空,循环:
每次取出两个节点,
1.若两个节点均为null,则继续进入下一个循环
(p==null&&q==null){ continue; }
2.若两个节点只有一个为空,或者两个节点的值不相等,则return false;
if (p==null||q==null||p.val!=q.val){ return false; }
3.把节点的左右子节点颠倒顺序加入队列:
queue.offer(p.left); queue.offer(q.right); queue.offer(p.right); queue.offer(q.left);
若队列最后为空,则二叉树是镜像对称的,return true;
java实现代码如下:
public boolean check1(TreeNode p, TreeNode q) {
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(p);
queue.offer(q);
while (!queue.isEmpty()){
p = queue.poll();
q = queue.poll();
if(p==null&&q==null){
continue;
}
if (p==null||q==null||p.val!=q.val){
return false;
}
queue.offer(p.left);
queue.offer(q.right);
queue.offer(p.right);
queue.offer(q.left);
}
return true;
}
理解思路之后,可以去leetcode试试手: