力扣【广度搜索专题】👊 199. 二叉树的右视图

151 阅读1分钟

「这是我参与2022首次更文挑战的第 22 天,活动详情查看:2022首次更文挑战

题目链接

199. 二叉树的右视图 - 力扣(LeetCode) (leetcode-cn.com)

题目描述

给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

测试用例

示例 1:

image.png

输入: [1,2,3,null,5,null,4]
输出: [1,3,4]

条件限制

  • 二叉树的节点个数的范围是 [0,100]
  • -100 <= Node.val <= 100

题目分析

为题目的要求换一个描述,题目需要我们输出每一层的右侧的第一个节点。这种需要对树按层遍历的操作,一律使用广度搜索处理

题目需要我们从上往下遍历树,并以数组的形式,返回每层最右侧的节点的值

我们按照从上往下、从右往左的顺序遍历树,并将遍历过程中读到的节点以 unshift 的方式不断的添加到 nodes 中。再使用一个长度变量 len 辅助定位从右取出的多少个节点为同一层的元素;我们再使用一个标记 flag=true 表示当前层最右侧的节点的值还未被记录,当这一层最右侧的值已经记录好了后,修改标记为 false

思考:例如已经获取到第 2 层的最右节点,是否有必要完整的遍历第 2 层,从示例来看第 3 层的最右节点,也是位于第 2 层最右节点的子节点

对示例进行调整,如下:

image.png

可以发现每层的最右节点,不一定会存在上下直连的情况,还是需要完整的遍历每一层的节点,目的是为了拿到下一层的全部节点

代码实现

var rightSideView = function(root) {
    if (root == null) return [];
    let arr = [root],
        len = arr.length,
        vals = [];
    while (len > 0) {
        let flag = true;
        for (; len > 0; len--) {
            let curr = arr.pop();
            if (flag) {
                flag = false;
                vals.push(curr.val);
            }
            if (curr.right != null) arr.unshift(curr.right);
            if (curr.left != null) arr.unshift(curr.left);
        }
        len = arr.length;
    }
    return vals;
};

image.png

或许这个题难度定义有点名不副实?套用广度搜索的模板代码,添加数行代码即可解决问题