题目描述
请实现一个函数,用来判断一棵二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
即左右子树交换后 和原来的树 一模一样
方法1:
/*
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)
{
TreeNode minorTree = createDuiChenTree(pRoot);
return isDuiChenTree(pRoot,minorTree);
}
public boolean isDuiChenTree(TreeNode pRoot,TreeNode minorTree){
if(pRoot == null && minorTree == null){
return true;
}else if(pRoot == null || minorTree == null){
return false;
}else if(pRoot.val == minorTree.val){
return isDuiChenTree(pRoot.left,minorTree.left) && isDuiChenTree(pRoot.right,minorTree.right);
}
return false;
}
/**
* 左右子树交换
*/
public TreeNode createDuiChenTree(TreeNode root){
if(root == null){
return root;
}
TreeNode tree = new TreeNode(root.val);
if(root.right!=null){
tree.left = createDuiChenTree(root.right);
}
if(root.left!=null){
tree.right = createDuiChenTree(root.left);
}
return tree;
}
}
方法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)
{
//TreeNode minorTree = createDuiChenTree(pRoot);
// return isDuiChenTree(pRoot,minorTree);
if(pRoot == null){
return true;
}
return isDuiChenTree2(pRoot.left,pRoot.right);
}
//方法1
public boolean isDuiChenTree(TreeNode pRoot,TreeNode minorTree){
if(pRoot == null && minorTree == null){
return true;
}else if(pRoot == null || minorTree == null){
return false;
}else if(pRoot.val == minorTree.val){
return isDuiChenTree(pRoot.left,minorTree.left) && isDuiChenTree(pRoot.right,minorTree.right);
}
return false;
}
/**
* 左右子树交换
*/
public TreeNode createDuiChenTree(TreeNode root){
if(root == null){
return root;
}
TreeNode tree = new TreeNode(root.val);
if(root.right!=null){
tree.left = createDuiChenTree(root.right);
}
if(root.left!=null){
tree.right = createDuiChenTree(root.left);
}
return tree;
}
//方法2 同一颗树的最左节点和最右节点 是相同的 相当于省略了创建对称树
//左子树遍历 左节点 对应 右子树遍历 右节点 左子树右节点 对应右子树左节点
public boolean isDuiChenTree2(TreeNode left,TreeNode right){
if(left == null && right == null){
return true;
}else if(left == null || right == null){
return false;
}else if(left.val == right.val){
return isDuiChenTree2(left.left,right.right) && isDuiChenTree2(left.right,right.left);
}
return false;
}
}