OJ链接:对称二叉树
题目描述:
给定一个二叉树,检查它是否是镜像对称的。
示例:
思路一:递归实现。判断左子树的左树和右子树的右树以及左子树的右树和右子树的左树是否镜像(对称)。
public class Num101 {
//递归实现
public boolean isSymmetric(TreeNode root) {
if (root == null) {
return true;
}
return isMirror(root.left, root.right);
}
/**
* 判断传入的两棵树是否互为镜像
* @param rootLeft
* @param rootRight
* @return
*/
public boolean isMirror(TreeNode rootLeft,TreeNode rootRight){
if(rootLeft==null && rootRight==null){
return true;
}
if(rootLeft==null || rootRight==null){
return false;
}
if(rootLeft.val!= rootRight.val){
return false;
}
return isMirror(rootLeft.right,rootRight.left) && isMirror(rootLeft.left,rootRight.right);
}
}
思路二:迭代实现。判断根节点为空或根节点的左右子树都为空时,返回true,然后将根节点的左右子树入队,开始循环,当队列不为空时,每次取出两个节点(一组元素),若两个元素都为空,则继续判断,若其中有一个为空,返回false,判读两个元素的值是否相等,不相等返回false,最后将取出的这两个节点的左树右树全部入队,以此循环,直到队列为空结束,若循环结束还没有返回值,就返回true。
import java.util.LinkedList;
import java.util.Queue;
public class Num101 {
public boolean isSymmetric(TreeNode root) {
if (root == null || (root.left==null && root.right==null)) {
return true;
}
//使用队列存储每一层需要判断的节点
Queue<TreeNode> queue = new LinkedList<>();
//存入左右根节点
queue.offer(root.left);
queue.offer(root.right);
while (!queue.isEmpty()) {
//每次取出一组元素
TreeNode left = queue.poll();
TreeNode right = queue.poll();
if (left == null && right == null) {
continue;
}
if (left == null || right == null) {
return false;
}
//当前左右树的根节点判断完毕,将left.left和right.right入队
//left.right和right.left入队
if (left.val != right.val) {
return false;
}
queue.offer(left.left);
queue.offer(right.right);
queue.offer(left.right);
queue.offer(right.left);
}
return true;
}
}