剑指 Offer 28. 对称的二叉树

91 阅读1分钟

剑指 Offer 28. 对称的二叉树

image.png

1.递归法

  • 同一个级别 两个节点如何判断它是否对称,假设设a 和 b两个同一代节点
  • 如果a 是 null 且 b也为null 则直接返回true
  • 如果a是null 但是b不是null 则返回false
  • 如果a不是null,但是b是null 则返回false
  • 否则就是a和b都不为null,则就需要进一步判断了,需要满足下面条件
  1. a.val === b.val
  2. a.left 和 b.right 也是一对对称节点
  3. a.right 和 b.left 也是一对对称节点
var isSymmetric = function(root) {
    if(!root) return true
    var f = (left,right) => {
        if(!left && !right) return true 
        if(!left || !right) return false // 这里和 上面有先后关系
        return (
            f(left.right,right.left) && 
            f(left.left,right.right) &&
            left.val == right.val
        )      
    }
    return f(root.left,root.right)
};

2.方法二

把每一代的节点都放入一个队列里面,然后等到队列走完后,再次入列下一代的节点,直到所有的节点都走完

const isSymmetric = (root) => {
  if (!root) return true;
  const queue = [root.left, root.right];
  while (queue.length) {
    const len = queue.length;
    for (let i = 0; i < len; i += 2) {
      const left = queue.shift();
      const right = queue.shift();
      if ((left && !right) || (!left && right)) return false;
      if (left && right) {
        if (left.val !== right.val) return false;
        queue.push(left.left, right.right, left.right, right.left);
      }
    }
  }
  return true;
};