给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3]
是对称的。
1 / \ 2 2 / \ / \ 3 4 4 3
但是下面这个 [1,2,2,null,3,null,3]
则不是镜像对称的:
1 / \ 2 2 \ \ 3 3
说明:
如果你可以运用递归和迭代两种方法解决这个问题,会很加分。
可以把传进来的这棵树当成两棵进行处理,判断这两个树互为镜像的地方是否相等即可。
若两棵树互为镜像,则
- 它们的根节点的值相等。
- 每棵树的右子树与另一棵树的左子树互为镜像。
所以对于递归的版本,可以这样写:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSymmetric(TreeNode root) {
return cal(root,root);
}
boolean cal(TreeNode r1,TreeNode r2){
if(r1==null&&r2==null)return true;
if(r1==null||r2==null)return false;
return r1.val==r2.val&&cal(r1.left,r2.right)&&cal(r1.right,r2.left);
}
}
对于迭代的版本,需要用到一个队列。对两棵树进行类似BFS的遍历,但是每次将两棵树的左右子树以相反的顺序入队,即先将r1的左子树和r2的右子树入队,再将r1的右子树和r2的左子树入队,这样队列中每两个连续的节点就是两棵树中互为镜像的节点,再检查这两个节点是否相等即可。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSymmetric(TreeNode root) {
Queue<TreeNode> q = new LinkedList<>();
q.add(root);
q.add(root);
while(!q.isEmpty()){
TreeNode r1=q.poll();
TreeNode r2=q.poll();
if(r1==null&&r2==null)continue;
if(r1==null||r2==null)return false;
if(r1.val!=r2.val)return false;
q.add(r1.left);
q.add(r2.right);
q.add(r1.right);
q.add(r2.left);
}
return true;
}
}
本文参考了leetcode上的解读。