题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
思路:
首先分析下这个对称二叉树,也就是一个二叉树中间对称。所以我们可以使用递归的思想,首先以根节点以及其左右子树,左子树的左子树和右子树的右子树相同,左子树的右子树和右子树的左子树相同。两个条件都要符合,所以我们第一个传根节点的左子树和右子树,先判断左右子树根结点的比较。然后分辨对左子树的左子树和右子树的右子树。左子树的右子树和右子树的左子树进行判断。只有两个条件都满足则返回的是true,一层一层递归进入,则可以得到结果。
实现:
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
boolean isSymmetrical(TreeNode pRoot)
{
/*
思路:首先根结点以及其左右子树,左子树的左子树和右子树的右子树相同,
左子树的右子树,和右子树的左子树相同。我们采用递归的方式
*/
if(pRoot == null){
return false;
}
return comRoot(pRoot.left, pRoot.right);
}
public static boolean comRoot(TreeNode left, TreeNode right){
if(left == null){
return right == null;
}
if(right == null){
return false;//能执行到这一步,说明他的左子树肯定是不为空,此时比较右子树如果为空,那么肯定返回false
}
if(left.val != right.val){
return false;
}
//能执行到这一步,说明其传进来的左子树和右子树不为null,且对应值相等,此时我们只需要,进行递归比较
//传进来的左子树的左子树和传进来右子树的右子树。传进来的左子树的右子树和传进来的右子树的左子树。
return comRoot(left.left, right.right) && comRoot(left.right, right.left);
}
}