1 题目
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
1 / \ 2 2 / \ / \ 3 4 4 3
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
1 / \ 2 2 \ \ 3 3
进阶:
你可以运用递归和迭代两种方法解决这个问题吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/symmetric-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2 Java代码
2.1 队列实现
import java.util.LinkedList;
import java.util.Queue;
public class IsSymmetric {
public static void main(String[] args) {
IsSymmetric isSymmetric = new IsSymmetric();
TreeNode root = new TreeNode(2);
root.setLeft(new TreeNode(4));
root.setRight(new TreeNode(4));
TreeNode l = root.getLeft();
l.setRight(new TreeNode(80));
l.setLeft(new TreeNode(100));
// l.getRight().setLeft(new TreeNode(62));
// l.getRight().setRight(new TreeNode(70));
TreeNode r = root.getRight();
r.setLeft(new TreeNode(80));
r.setRight(new TreeNode(100));
// r.getLeft().setRight(new TreeNode(58));
System.out.println(isSymmetric.isSymmetric(root));
}
public boolean isSymmetric(TreeNode root) {
if (null==root ||(null==root.left && null == root.right))
return true;
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root.left);
queue.add(root.right);
while (!queue.isEmpty()){
/**
* 先将待比较的左右子树取出
*/
TreeNode l = queue.poll();
TreeNode r = queue.poll();
/**
* 如果左右都为空,则继续遍历
*
*/
if (null == l && null == r){
continue;
}
/**
* 如果左右其中有一个为空,则返回false
*/
if (null == l || null == r){
return false;
}
/**
* 如果左右子树的值不想等, 则返回false
*/
if (l.val != r.val)
return false;
/**
* 对应添加值,左子树的左子树对应右子树的右子树
* 左子树的右子树对应右子树的左子树
*/
queue.add(l.left);
queue.add(r.right);
queue.add(l.right);
queue.add(r.left);
}
return true;
}
}