「这是我参与2022首次更文挑战的第 22 天,活动详情查看:2022首次更文挑战」
题目链接
199. 二叉树的右视图 - 力扣(LeetCode) (leetcode-cn.com)
题目描述
给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
测试用例
示例 1:
输入: [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 层最右节点的子节点
对示例进行调整,如下:
可以发现每层的最右节点,不一定会存在上下直连的情况,还是需要完整的遍历每一层的节点,目的是为了拿到下一层的全部节点
代码实现
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;
};
或许这个题难度定义有点名不副实?套用广度搜索的模板代码,添加数行代码即可解决问题