题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。

这题我看了一下,有些题解也太复杂了吧。其实这道题很简单,用recursion思路也清晰易懂,还不麻烦。
如果我们拥有一颗对称二叉树,他只需要满足,每个节点的左子树和右子树都是镜像。
所以解题思路分四步:

  1. 我们检测根节点是不是为null,如果是,则他肯定是对称的,直接返回true。
  2. 我们新建一个method check,用来检测当前的左子树和右子树是不是镜像。我们从根节点往下一路检测。
  3. 举个例子,首先我们检测根节点的左孩子和右孩子,如果两个都是null,说明他是镜像。但是如果有一个不为null或者他们的值不相等,则此时我们就可以判断已经是不对称的了。如果此时还是对称的而且左孩子和右孩子都分别还有各自的孩子,我们就继续检测。这时,我们需要判断,左孩子的左子树和右孩子的右子树是否镜像,及左孩子的右子树和右孩子的左子树是否镜像。
  4. 如此进入下一次循环,直到我们接触到叶节点还是镜像return true或者我们任意时刻发现不是镜像return false 为止。

具体代码如下:

public class Solution {
    boolean isSymmetrical(TreeNode pRoot)
    {
       if(pRoot == null){
           return true;
       } 
       return check(pRoot.left,pRoot.right);
    }

    boolean check(TreeNode l,TreeNode r){
        if(l == null && r == null){
            return true;
        }else if((l== null&&r!= null)||(l != null && r== null)||(l.val != r.val)){
            return false;
        }
        return check(l.left,r.right) && check(l.right,r.left);
    }
}