(JS栈) LeetCode101. 对称二叉树

题目:
给定一个二叉树,检查它是否是镜像对称的。

例如,二叉树 [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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。