「这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战」
题目
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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
进阶:
你可以运用递归和迭代两种方法解决这个问题吗?
解题思路
判断二叉树是否是镜像的,我们需要比较子树的对称位置是否相同。
即左子树的左侧与右子树右侧,左子树右侧与右子树左侧。
方法一:递归法
可看作一个分治问题,比较左右子树是否镜像
分:获取两个树的左子树和右子树。 解:递归地判断树1的左子树和树2的右子树是否镜像,树1的右子树和树2的左子树是否镜像。 合:如果上述都成立,且根节点值也相同,两个树就镜像。
var isSymmetric = function(root) {
if(!root) return true
const isMirror = (l, r) => {
if(!l && !r) return true; // 两个空子树为镜像
if(
l && r && l.val === r.val &&
isMirror(l.left, r.right) &&
isMirror(l.right, r.left)
) {
return true;
}
return false;
}
return isMirror(root.left, root.right)
};
复杂度分析:
-
时间复杂度O(n),每个节点遍历一次。
-
空间复杂度O(n)
方法二:迭代法
使用队列,将互为镜像的节点添加如队列中,然后再比较。
function isSymmetric(root: TreeNode | null): boolean {
const isMirror = (l, r) => {
const queue = [l, r];
while (queue.length) {
const u = queue.shift();
const v = queue.shift();
if (!u && !v) continue;
if ((!u || !v) || (u.val !== v.val)) return false;
queue.push(u.left, v.right);
queue.push(v.left, u.right);
}
return true;
}
return isMirror(root.left, root.right)
};
复杂度分析:
-
时间复杂度O(n)
-
空间复杂度O(n)
结束语
这里是小葵🌻,只要把心朝着太阳的地方,就会有温暖~
让我们一起来攻克算法难关吧!!