39.对称二叉树

65 阅读1分钟

题目链接

给你一个二叉树的根节点 root , 检查它是否轴对称。

解法1 递归

思路

因为函数签名只有一个节点入口,而题目要求的是二叉树是否镜像,既然镜像那肯定需要比较左子树和右子树。

所以需要一个辅助函数来去解决问题,这个辅助函数接受该节点的左右子树。

如果左右子树都为空则对称,其中有一个为空 另一个不为空则不对称。

接下来比较左右子树的值以及递归检查左右子树。

代码

function isSymmetric(root: TreeNode | null): boolean {
    if (!root) {
        return true;
    }

    const check = (left, right) => {
        if (!left && !right) return true;
        if (!left || !right) return false;

        return (
            left.val === right.val &&
            check(left.left, right.right) &&
            check(left.right, right.left)
        );
    }

    return check(root.left, root.right);
};

时空复杂度

时间复杂度:O(n)

空间复杂度:O(h) 主要为递归栈开销

解法2 迭代

思路

利用层序遍历的思路,每次出队两个节点,比较是否相等之后,成对入队。

左子树的左节点和右子树的右节点成对,左子树的右节点和右子树的左节点成对。

代码

function isSymmetric(root: TreeNode | null): boolean {
    if (!root) {
        return true;
    }

    let queue = [root.left, root.right];

    while (queue.length) {
        const t1 = queue.shift()!;
        const t2 = queue.shift()!;

        if (!t1 && !t2) continue;
        if (!t1 || !t2) return false;
        if (t1.val !== t2.val) return false;

        queue.push(t1.left, t2.right);
        queue.push(t1.right, t2.left);
    }

    return true;
};

时空复杂度

时间复杂度:O(n)

空间复杂度:O(n)