题目
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
思路
左树的左子树等于右树的右子树,左树的右子树等于右树的左子树,对应位置刚好相反,判断两子树相反位置上的值是否相等即可
测试用例
1.功能测试(对称二叉树;结构不对称二叉树;结构对称但值不对称二叉树)
2.特殊测试(根结点为null;单个结点;所有结点的值都相等的二叉树)
代码
public class symmetrical {
public static class TreeNode{
int val;
TreeNode left=null;
TreeNode right=null;
public TreeNode(int val) {
this.val = val;
}
}
public static boolean isSymmetrical(TreeNode pRoot){
if (pRoot==null){
return true;
}
return isEqual(pRoot.left,pRoot.right);
}
private static boolean isEqual(TreeNode pRoot1,TreeNode pRoot2){
if (pRoot1==null&&pRoot2==null)
return true;
if(pRoot1==null||pRoot2==null){
return false;
}
return pRoot1.val==pRoot2.val&&isEqual(pRoot1.left,pRoot2.right)&&isEqual(pRoot1.right,pRoot2.left);
}
public static void main(String[] args) {
TreeNode nodea1=new TreeNode(8);
TreeNode nodea21=new TreeNode(6);
TreeNode nodea22=new TreeNode(6);
TreeNode nodea31=new TreeNode(5);
TreeNode nodea32=new TreeNode(7);
TreeNode nodea33=new TreeNode(7);
TreeNode nodea34=new TreeNode(5);
nodea1.left=nodea21;
nodea1.right=nodea22;
nodea21.left=nodea31;
nodea21.right=nodea32;
nodea22.left=nodea33;
nodea22.right=nodea34;
System.out.println(isSymmetrical(nodea1));
}
}
代码优化
//原始代码
if (pRoot1==null&&pRoot2!=null){
return false;
}
if (pRoot1!=null&&pRoot2==null){
return false;
}
//优化后代码
if (pRoot1==null||pRoot2==null){
return false;
}