# 101. 对称二叉树

给定一个二叉树,检查它是否是镜像对称的。

例如,二叉树 [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

说明:

如果你可以运用递归和迭代两种方法解决这个问题,会很加分。


// 优化后
var isSymmetric = function(root) {
  function compare(a, b) {
    if (a === null && b === null) {
      return true;
    }
    if (a === null || b === null) {
      return false;
    }
    return a.val === b.val && compare(a.left, b.right) && compare(a.right, b.left);
  }

  return compare(root, root);;
};

// 一开始的💩
var isSymmetric = function(root) {
  let flag = true;

  function xx(a, b) {
    if (!flag) return;

    if (a === null && b === null) {
      return;
    }

    if (!!a && b === null) {
      flag = false;
      return;
    }

    if (a === null && !!b) {
      flag = false;
      return;
    }

    if(a.val === b.val) {
      xx(a.left, b.right);
      xx(a.right, b.left)
    } else {
      flag = false;
    }
  }

  if (root === null) {
    return flag;
  }

  xx(root.left, root.right);

  return flag;
};

总结: 思路我也是用到了递归,虽然也是写出来了,但是我在条件的逻辑判断上还是火候不够, 写的不够干练, 还有一种解法 使用 队列迭代

function isSymmetric(root) {

  const queue = [];

  queue.push(root);
  queue.push(root);

  while (queue.length > 0) {
    const a = queue.shift();
    const b = queue.shift();
    if (a === null && b === null) continue;
    if (a === null || b === null) return false;
    if (a.val !== b.val) return false;
    queue.push(a.left)
    queue.push(b.right)
    queue.push(a.right)
    queue.push(b.left)
  }

  return true;
}