【leetcode】199. 二叉树的右视图

31 阅读1分钟

leetcode-199.png

这一题就要学会思维转换了,要看最右侧的节点,那就进行层序遍历,然后返回每一层的最后一个节点就好了。

层序遍历

1

var rightSideView = function (root) {
    if (!root) return []
    let level = []
    let queue = [root]
    while (queue.length) {
        let size = queue.length
        let l = []
        for (let i = 0; i < size; ++i) {
            let node = queue.shift()
            l.push(node.val)
            if (node.left) queue.push(node.left)
            if (node.right) queue.push(node.right)
        }
        level.push(l)
    }
    let res = []
    level.forEach(el => {
        res.push(el[el.length - 1])
    })
    return res
};

2优化

上述代码存在一定的冗余,还是需要使用层序遍历,但是没必要把层序遍历的结果存下来

var rightSideView = function(root) {
    if (!root) return [];
    let res = [];
    let queue = [root];

    while (queue.length) {
        let size = queue.length;
        let lastNode = null;

        for (let i = 0; i < size; ++i) {
            let node = queue.shift();
            lastNode = node; // 在每层最后一个节点时更新 lastNode

            if (node.left) queue.push(node.left);
            if (node.right) queue.push(node.right);
        }

        res.push(lastNode.val); // 将最后一个节点的值添加到结果数组中
    }

    return res;
};

3

这种就更直观了,直接把尾部push到结果之中

var rightSideView = function (root) {
    if (!root) return []
    const queue = [root]
    const res = []
    while (queue.length) {
        let size = queue.length
        res.push(queue[size - 1].val)
        for (let i = 0; i < size; ++i) {
            let node = queue.shift()
            if (node.left) queue.push(node.left)
            if (node.right) queue.push(node.right)
        }
    }
    return res
};

错误解法

这里我想着直接沿着最右侧的路径走就好了,但是忽略了一种情况
对于这里的左子树上的节点,就没发遍历了

image.png

var rightSideView = function (root) {
    if(!root) return []
    let res = [root.val];
    let current = root;
    while (current) {
        if (current.right) {
            res.push(current.right.val);
            current = current.right
        } else if (current.left) {
            res.push(current.left.val);
            current = current.left
        } else {
            return res;
        }
    }
};