题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
这题我看了一下,有些题解也太复杂了吧。其实这道题很简单,用recursion思路也清晰易懂,还不麻烦。
如果我们拥有一颗对称二叉树,他只需要满足,每个节点的左子树和右子树都是镜像。
所以解题思路分四步:
- 我们检测根节点是不是为null,如果是,则他肯定是对称的,直接返回true。
- 我们新建一个method check,用来检测当前的左子树和右子树是不是镜像。我们从根节点往下一路检测。
- 举个例子,首先我们检测根节点的左孩子和右孩子,如果两个都是null,说明他是镜像。但是如果有一个不为null或者他们的值不相等,则此时我们就可以判断已经是不对称的了。如果此时还是对称的而且左孩子和右孩子都分别还有各自的孩子,我们就继续检测。这时,我们需要判断,左孩子的左子树和右孩子的右子树是否镜像,及左孩子的右子树和右孩子的左子树是否镜像。
- 如此进入下一次循环,直到我们接触到叶节点还是镜像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); } }