LeetCode探索(25):101-对称二叉树

187 阅读1分钟

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

题目

给你一个二叉树的根节点 root , 检查它是否轴对称。

示例 1:

输入:root = [1,2,2,3,4,4,3]
输出:true

示例 2:

输入:root = [1,2,2,null,3,null,3]
输出:false

提示:

  • 树中节点数目在范围 [1, 1000]
  • -100 <= Node.val <= 100

**进阶:**你可以运用递归和迭代两种方法解决这个问题吗?

思考

这是二叉树相关的一道题目,难度简单。

我们前面接触了二叉树相关的几道题,对于二叉树的特点有了一定的了解。本题中,为了判断给出的二叉树是否轴对称,我们可以使用递归迭代等方法去解决问题。

比如迭代的解法,我们可以新建队列 q,存储二叉树每一层的节点。然后,每次取出队列中的两个节点比较其是否轴对称。这样迭代下去,如果每次都是轴对称的,那么显然整棵二叉树是轴对称的。

两个节点满足轴对称,只有当两个节点的值相等,且节点1的左子树等于节点2的右子树以及节点1的右子树等于节点2的左子树。

下面是具体代码。

解答

方法一:迭代

const check = (u, v) => {
  const q = [] // 队列
  q.push(u, v)
  while (q.length) {
    u = q.shift()
    v = q.shift()
    if (!u && !v) continue
    if ((!u || !v) || (u.val !== v.val)) return false
    q.push(u.left)
    q.push(v.right)
    q.push(u.right) 
    q.push(v.left)
  }
  return true
}
var isSymmetric = function(root) {
  return check(root, root)
}

复杂度分析

  • 时间复杂度:O(n)。

  • 空间复杂度:每个节点最多进队一次,出队一次,队列中最多不会超过 n 个点,故渐进空间复杂度为 O(n)。

方法二:递归

var isSymmetric = function(root) {
  const check = (p, q) => {
    if (!p && !q) return true
    if (!p || !q) return false
    return p.val === q.val && check(p.left, q.right) && check(p.right, q.left)
  }
  return check(root, root)
}

复杂度分析

  • 时间复杂度:O(n)。
  • 空间复杂度:这里递归层数不超过 n,故渐进空间复杂度为 O(n)。

参考