题目描述

请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
例如,二叉树 [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

示例 1:
输入:root = [1,2,2,3,4,4,3] 输出:true
示例 2:
输入:root = [1,2,2,null,3,null,3] 输出:false

代码

Java-递归

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode(int x) { val = x; }
  8. * }
  9. */
  10. class Solution {
  11. public boolean isSymmetric(TreeNode root) {
  12. if(root == null) return true;
  13. else return isSymm(root.left,root.right);
  14. }
  15. public boolean isSymm(TreeNode nodeOne,TreeNode nodeTwo){
  16. if(nodeOne == null && nodeTwo == null) return true;
  17. if(nodeOne == null || nodeTwo == null) return false;
  18. if(nodeOne.val != nodeTwo.val) return false;
  19. if(isSymm(nodeOne.left,nodeTwo.right)&&isSymm(nodeOne.right,nodeTwo.left)) return true;
  20. return false;
  21. }
  22. }

Java-迭代-官方题解

首先我们引入一个队列,这是把递归程序改写成迭代程序的常用方法。初始化时我们把根节点入队两次。每次提取两个结点并比较它们的值(队列中每两个连续的结点应该是相等的,而且它们的子树互为镜像),然后将两个结点的左右子结点按相反的顺序插入队列中。当队列为空时,或者我们检测到树不对称(即从队列中取出两个不相等的连续结点)时,该算法结束。

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/dui-cheng-de-er-cha-shu-lcof/solution/dui-cheng-de-er-cha-shu-by-leetcode-solu-rgks/
来源:力扣(LeetCode)

  1. class Solution {
  2. public boolean isSymmetric(TreeNode root) {
  3. return check(root, root);
  4. }
  5. public boolean check(TreeNode u, TreeNode v) {
  6. Queue<TreeNode> q = new LinkedList<TreeNode>();
  7. q.offer(u);
  8. q.offer(v);
  9. while (!q.isEmpty()) {
  10. u = q.poll();
  11. v = q.poll();
  12. if (u == null && v == null) {
  13. continue;
  14. }
  15. if ((u == null || v == null) || (u.val != v.val)) {
  16. return false;
  17. }
  18. q.offer(u.left);
  19. q.offer(v.right);
  20. q.offer(u.right);
  21. q.offer(v.left);
  22. }
  23. return true;
  24. }
  25. }