101-对称二叉树

对称二叉树

题目

给定一个二叉树,检查它是否是镜像对称的。

例如,二叉树 [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

说明:

如果你可以运用递归和迭代两种方法解决这个问题,会很加分。

思路

  • 递归
    要镜像对称,也就是左子树等于右子树
  • 迭代
    除了递归的方法外,我们也可以利用队列进行迭代。队列中每两个连续的结点应该是相等的,而且它们的子树互为镜像。最初,队列中包含的是 root 以及 root。该算法的工作原理类似于 BFS,但存在一些关键差异。每次提取两个结点并比较它们的值。然后,将两个结点的左右子结点按相反的顺序插入队列中。当队列为空时,或者我们检测到树不对称(即从队列中取出两个不相等的连续结点)时,该算法结束。

代码

  • 递归
class Solution {
    public boolean isSymmetric(TreeNode root) {
        if(root == null){
            return true;
        }   
        return isSym(root.left,root.right);
    }
    
    public static boolean isSym(TreeNode r1,TreeNode r2){
        if(r1 == null && r2 == null){
            return true;
        }
        if(r1 == null || r2 == null){
            return false;
        }
        //判断根目录是否相等,r1根目录的左子树和r2根目录的右子树,r1根目录的右子树和r2根目录的左子树是否相等
        return r1.val == r2.val && isSym(r1.right,r2.left) && isSym(r1.left,r2.right);
    }
}
  • 迭代

采用队列,或者栈都是可以的,两两比较就可以.

public boolean isSymmetric(TreeNode root) {
    Queue q = new LinkedList<>();
    q.add(root);
    q.add(root);
    while (!q.isEmpty()) {
        TreeNode t1 = q.poll();
        TreeNode t2 = q.poll();
        if (t1 == null && t2 == null) continue;
        if (t1 == null || t2 == null) return false;
        if (t1.val != t2.val) return false;
        q.add(t1.left);
        q.add(t2.right);
        q.add(t1.right);
        q.add(t2.left);
    }
    return true;
}

你可能感兴趣的:(101-对称二叉树)