【leetcode】101. 对称二叉树

82 阅读1分钟

leetcode-101.png

这里是比较的镜像,所以进一步简化成了
left.leftright.right 比较
left.rightright.left 比较

这里看bfs的思路,我感觉更容易理解一些

递归

  • 对称的条件是:根节点的左子树和右子树相互镜像。

  • 对于两个树 A 和 B,它们是镜像对称的当且仅当:

    1. 它们的根节点值相同。
    2. A 的左子树与 B 的右子树镜像对称。
    3. A 的右子树与 B 的左子树镜像对称。
var isSymmetric = function(root) {
    if (!root) return true;

    function isMirror(left, right) {
        if (!left && !right) return true;
        if (!left || !right) return false;
        return (
            left.val === right.val &&
            isMirror(left.left, right.right) &&
            isMirror(left.right, right.left)
        );
    }

    return isMirror(root.left, root.right);
};
var isSymmetric = function (root) {
    if (!root) return true
    return helper(root.left, root.right)
};

var helper = function (left, right) {
    if (!left && !right) {
        return true
    } else if ((!left && right) || (left && !right)) {
        return false
    } else {
        return helper(left.left, right.right) && (left.right, right.left)
    }
}

迭代法

  • 使用队列来实现树的层次遍历,同时检查每一层的节点是否是对称的。
    推入队列的顺序要注意,两两成对的push进入,关注小问题,也就是
    left.leftright.right 比较
    left.rightright.left 比较
    后面的自然形成规律
var isSymmetric = function (root) {
    let queue = []
    queue.push(root.left, root.right)
    while (queue.length) {
        let left = queue.shift()
        let right = queue.shift()
        if (!left && !right) continue
        if (!left || !right || left.val !== right.val) return false
        queue.push(left.left, right.right)
        queue.push(left.right, right.left)
    }
    return true
};