1、题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
2、代码实现
/*
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)
{
//1、边界检测:空树是对称的
if (pRoot == null) {
return true;
}
//2、先求出该树的镜像树
TreeNode root = Mirror(pRoot);
//3、把两棵树的比较结果进行返回,两棵树相同返回true,两棵树不相同返回false
return isSymmetrical(pRoot, root);
}
//这个函数就是比较给定的两棵树是否相等的
private boolean isSymmetrical(TreeNode pRoot, TreeNode root) {
//边界值检测:如果两棵树都为空则两棵树是一样的,如果两棵树只有其中一棵树为空,那么两棵树
//是不对称的
if (root == null && pRoot == null) {
return true;
} else if (root == null || pRoot == null) {
return false;
}
//边界值检测完毕比较两棵树的根结点值是否相等,如果相等,在递归的比较两棵树的左子树和右子树是否相等
if (root.val == pRoot.val) {
return isSymmetrical(root.left, pRoot.left) && isSymmetrical(root.right, pRoot.right);
}
return false;
}
//这个函数的作用就是求出给定根节点对应树的镜像树
private TreeNode Mirror(TreeNode root) {
if (root == null) {
return null;
}
//创建一个新的根节点,然后把原根节点的左子树赋值给新创建根节点的右子树
//把原根节点的右子树赋值给新创建根节点的左子树,最后返回新创建的根节点即可
TreeNode tempRoot = new TreeNode(root.val);
tempRoot.left = Mirror(root.right);
tempRoot.right = Mirror(root.left);
return tempRoot;
}
}
原文:https://www.cnblogs.com/BaoZiY/p/11183620.html