「这是我参与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)。