题目:对称的二叉树
题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
解题思路:
(1)先将此二叉树pRoot进行镜像处理,得到root,再将root和pRoot前序遍历,比较个节点的值
(2)进行递归
第一种解法:先镜像,再比较
代码实现:
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
import java.util.*;
public class Solution {
boolean isSymmetrical(TreeNode pRoot)
{
if(pRoot==null) {
return true;
}
//得到镜像后的二叉树:root
TreeNode root= Mirror(pRoot);
boolean flag=isValid(pRoot,root);
return flag;
}
private boolean isValid(TreeNode pRoot, TreeNode root) {
if(pRoot==null && root==null) {
return true;
}else if(pRoot==null || root==null) {
return false;
}else {
//节点此时的值不同,返回false;
if(pRoot.val!=root.val) {
return false;
}else {
return isValid(pRoot.left,root.left) && isValid(pRoot.right,root.right);
}
}
}
private TreeNode Mirror(TreeNode pRoot) {
//结束,返回结果
if(pRoot==null) {
return null;
}
TreeNode root=new TreeNode(pRoot.val);
root.left=Mirror(pRoot.right);
root.right=Mirror(pRoot.left);
return root;
}
}
第二种方法:递归
首先根节点以及其左右子树,左子树的左子树和右子树的右子树相同
左子树的右子树和右子树的左子树相同即可,采用递归
非递归也可,采用栈或队列存取各级子树根节点
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
import java.util.*;
public class Solution {
boolean isSymmetrical(TreeNode pRoot)
{
if(pRoot==null) {
return true;
}
return isValid(pRoot.left,pRoot.right);
}
private boolean isValid(TreeNode left, TreeNode right) {
//左子树的值不等于右子树的值,返回false;
if(left==null && right==null) {
return true;
}else if(left==null || right==null){
return false;
}
if(left.val!=right.val) {
return false;
}
//左子树的左节点和右子树的右节点是否相等&& 左子树的右节点是否等于左子树的左节点的值
return isValid(left.left,right.right) && isValid(left.right,right.left);
}
}