leetcode每天一题:【对称二叉树】(简单)

218 阅读2分钟

这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战

题目描述

给一个二叉树的根节点,请你判断它是否为轴对称,如果是则返回true,否则返回false

举个例子:

非轴对称,返回false(画的有点丑,凑合看)

image.png

是轴对称,返回true(这化的更有点丑)

image.png

是相同的树,但不是轴对称,返回false(感谢你能忍着看下来)

image.png

思路分析

第一种方法(递归)

通过上面的例子可以分析,它和上一篇文章判断相同的树不一样,相同的树是左边树,都要对应相等才可以,右边树,也要对应相等。

而对称二叉树,不是这样,它是要对称。

所以左边树和右边树,需要左边树的左子节点和右边树的右子节点相等才可以

左边树的右子节点和右边树的左子节点相等才可以

这样才是对称。

代码如下:

这个是用递归的方式实现,checkNodeIsSymmetric函数接受2个参数,左边树,和右边树,递归调用的时候传入左边树的左子节点和右边树的右子节点,如果相等,则继续判断,左边树的右子节点和右边树的左子节点。

判断到最后如果对称则返回true

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {boolean}
 */
var isSymmetric = function (root) {
  function checkNodeIsSymmetric (l, r) {
    if (!l && !r) return true
    if (!l && r) return false
    if (l && !r) return false
    if (l.val !== r.val) return false
    return checkNodeIsSymmetric(l.left, r.right) && checkNodeIsSymmetric(l.right, r.left)
  }
  return checkNodeIsSymmetric(root.left, root.right)
};

image.png

第二种方法(迭代)

这个方法是迭代方法,while循环实现的。用2个队列数组,左边树和右边树队列数组。存到是左右树的子节点,遍历完一层判断,再继续下一层。

判断的时候从队列数组的开头取出子节点判断,左边树的左子节点和右边树的右子节点判断,左边树的右子节点和右边树的左子节点判断。

如果判断到最后队列数组都为空的时候,如果此时还没有返回false,则代表遍历结束,则证明是对称二叉树,返回true即可。

代码如下:

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {boolean}
 */
var isSymmetric = function (root) {
  const l = root.left
  const r = root.right
  if (!l && !r) return true
  if (!l || !r) return false

  const lQuene = [l]
  const rQuene = [r]
  while (lQuene.length || rQuene.length) {
    let lLen = lQuene.length
    let rLen = rQuene.length
    if (lLen !== rLen) return false
    const l = lQuene.shift()
    const r = rQuene.shift()
    if (l.val !== r.val) return false
    const ll = l.left
    const lr = l.right
    const rl = r.left
    const rr = r.right
    if ((ll && !rr) || (!ll && rr)) return false
    if ((lr && !rl) || (!lr && rl)) return false
    ll && lQuene.push(ll)
    lr && lQuene.push(lr)
    rr && rQuene.push(rr)
    rl && rQuene.push(rl)
  }
  return true
};

image.png