题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
1.递归法
思路:1.如果节点值为空则返回true。
2.否则递归左子树,右子树
3.如果root1,root2两个节点值都为空则返回true,否则如果root1的值与root2的值相等,则递归。
/*
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)
{
if(pRoot==null) return true;
return isSymmetricals(pRoot.left,pRoot.right);
}
boolean isSymmetricals(TreeNode root1,TreeNode root2){
if(root1==null&&root2==null) return true;
if(root1!=null&&root2!=null&&root1.val==root2.val)
return isSymmetricals(root1.left,root2.right)&&isSymmetricals(root1.right,root2.left);
return false;
}
}
2.非递归法(主要用层次遍历来实现)
思想:用二叉树的层次遍历来实现,从左右子树开始,从左往右的顺序加入q1中,从右往左顺序加入q2中。然后出队列进行条件判断。
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 {
boolean isSymmetrical(TreeNode pRoot)
{
Queue<TreeNode> q1=new LinkedList<TreeNode>();
Queue<TreeNode> q2=new LinkedList<TreeNode>();
if(pRoot==null) return true;
//先把节点值加进去
q1.offer(pRoot.left);
q2.offer(pRoot.right);
while(!q1.isEmpty()&&!q2.isEmpty()){
TreeNode root1=q1.peek();
q1.poll();
TreeNode root2=q2.peek();
q2.poll();
if(root1==null&&root2==null)
continue;
if(root1==null||root2==null)
return false;
if(root1.val!=root2.val)
return false;
q1.offer(root1.left);
q1.offer(root1.right);
q2.offer(root2.right);
q2.offer(root2.left);
}
return true;
}
}