题目:
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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、如果同时满足下面的条件,两个树互为镜像:
(1)它们的两个根结点具有相同的值。
(2)每个树的右子树都与另一个树的左子树镜像对称。
时间复杂度:O(n)
空间复杂度:O(n)最糟糕的情况下,树为线性
var isSymmetric = function(root) {
let helper = (t1, t2) => {
if(t1 === null && t2 === null) return true;
if(t1 === null || t2 === null) return false;
return t1.val === t2.val && helper(t1.left, t2.right) && helper(t2.left, t1.right)
}
return helper(root, root)
}
方法二 BFS+队列
思路:
1、队列中每两个连续的结点应该是相等的,而且它们的子树互为镜像
2、每次提取两个结点并比较它们的值。
3、将两个结点的左右子结点按相反的顺序插入队列中。
4、当队列为空时,或者我们检测到树不对称时,算法结束。
时间复杂度:O(n)
空间复杂度:O(n)
var isSymmetric = (root) => {
let q = [];
q.push(root);
q.push(root);
while (!!q.length) {
let t1 = q.shift();
let t2 = q.shift();
if (t1 == null && t2 == null) continue;
if (t1 == null || t2 == null) return false;
if (t1.val != t2.val) return false;
q.push(t1.left);
q.push(t2.right);
q.push(t1.right);
q.push(t2.left);
}
return true;
}