版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Slow_Wakler/article/details/60330372
题目描述
时间限制:1秒 空间限制:32768K
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
解题思路
(1)生成二叉树的镜像
(2)判断镜像和二叉树是否一样
代码(Java)
class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
public class Main {
//二叉树复制函数,复制后的二叉树为copyroot
public static void Copy(TreeNode root, TreeNode copyroot) {
if(root == null)return ;
copyroot.val = root.val;
if(root.left != null && root.right != null) {
copyroot.left = new TreeNode(1);
copyroot.right = new TreeNode(1);
} else if(root.left == null && root.right != null) {
copyroot.left = new TreeNode(1);
} else if(root.left != null && root.right == null) {
copyroot.right = new TreeNode(1);
}
Mirror(root.left, copyroot.left);
Mirror(root.right, copyroot.right);
}
//生成二叉树root的镜像copyroot
public static void Mirror(TreeNode root, TreeNode copyroot) {
if(root == null)return ;
copyroot.val = root.val;
if(root.left != null && root.right != null) {
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
copyroot.left = new TreeNode(1);
copyroot.right = new TreeNode(1);
} else if(root.left == null && root.right != null) {
root.left = root.right;
root.right = null;
copyroot.left = new TreeNode(1);
} else if(root.left != null && root.right == null) {
root.right = root.left;
root.left = null;
copyroot.right = new TreeNode(1);
}
Mirror(root.left, copyroot.left);
Mirror(root.right, copyroot.right);
}
//判断二叉树root1和root2是否一样
public static boolean isSample(TreeNode root1, TreeNode root2) {
if(root1 == null && root2 == null)return true;
if(root1 != null && root2 != null && root1.val != root2.val) return false;
if(root1 != null && root2 == null)return false;
if(root1 == null && root2 != null)return false;
if(root1.left != null && root2.left != null && !isSample(root1.left, root2.left))return false;
else if(root1.left != null && root2.left == null)return false;
else if(root1.left == null && root2.left != null)return false;
if(root1.right != null && root2.right != null && !isSample(root1.right, root2.right))return false;
else if(root1.right != null && root2.right == null)return false;
else if(root1.right == null && root2.right != null)return false;
return true;
}
//判断是否是对称的二叉树
public static boolean isSymmetrical(TreeNode pRoot)
{
if(pRoot == null)return true;
if(pRoot.left == null && pRoot.right == null) return true;
else if(pRoot.left != null && pRoot.right == null) return false;
else if(pRoot.left == null && pRoot.right != null) return false;
TreeNode copyRoot = new TreeNode(1);
TreeNode copyRoot2 = new TreeNode(1);
Copy(pRoot, copyRoot2);
Mirror(copyRoot2, copyRoot);
return isSample(pRoot, copyRoot);
}
/*
测试代码
*/
public static void main(String []args){
TreeNode root = new TreeNode(8);
root.left = new TreeNode(6);
root.left.left = new TreeNode(5);
root.left.right = new TreeNode(7);
root.right = new TreeNode(9);
root.right.left = new TreeNode(7);
root.right.right = new TreeNode(5);
System.out.println(isSymmetrical(root));
TreeNode root2 = new TreeNode(1);
Mirror(root, root2);
System.out.println(root2.val);
System.out.println(root2.left.val);
System.out.println(root2.left.left.val);
System.out.println(root2.left.right.val);
System.out.println(root2.right.val);
System.out.println(root2.right.left.val);
System.out.println(root2.right.right.val);
}
}