LeetCode刷题挑战-javascript:101.对称二叉树

293 阅读2分钟

R-C.jpeg

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

结束语

这里是小葵🌻,只要把心朝着太阳的地方,就会有温暖~

让我们一起来攻克算法难关吧!!