题目:请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
解析:该非递归法有点傻傻的,思想是利用队列进行层次遍历。然后翻转该二叉树,再层次遍历该二叉树,最后对比 两棵树的节点值是否一样的,一样的则是对称的,不一样的就不对称了。
import java.util.*;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
//二叉树镜像
public void reverseTree(TreeNode root){
if(root==null){
return ;
}
if(root.left!=null){
reverseTree(root.left);
}
if(root.right!=null){
reverseTree(root.right);
}
TreeNode temp=root.left;
root.left=root.right;
root.right=temp;
}
boolean isSymmetrical(TreeNode pRoot)
{
if(pRoot==null){
return true;
}
//队列1存储
TreeNode temp1;
Queue<TreeNode> queue1 = new LinkedList<>();
queue1.add(pRoot);
List<Integer> list1 =new ArrayList<>();
while(!queue1.isEmpty()){
temp1=queue1.poll();
list1.add(temp1.val);
if(temp1.left!=null){
queue1.add(temp1.left);
}
if(temp1.left==null){
list1.add(-1);//左孩子为空,添加-1标识
}
if(temp1.right!=null){
queue1.add(temp1.right);
}
if(temp1.right==null){
list1.add(-2);//右孩子为空,添加-2标识
}
}
reverseTree(pRoot);
//队列2存储
TreeNode temp2;
Queue<TreeNode> queue2 = new LinkedList<>();
queue2.add(pRoot);
List<Integer> list2 =new ArrayList<>();
while(!queue2.isEmpty()){
temp2=queue2.poll();
list2.add(temp2.val);
if(temp2.left!=null){
queue2.add(temp2.left);
}
if(temp2.left==null){
list2.add(-1);
}
if(temp2.right!=null){
queue2.add(temp2.right);
}
if(temp2.right==null){
list2.add(-2);
}
}
if(list1.equals(list2)){//比较两颗树的节点是否一样的
return true;
}
else{
return false;
}
}
}