121.二叉树的右视图
题目链接
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-right-side-view
题目描述
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例:
输入: [1,2,3,null,5,null,4]
输出: [1, 3, 4]
解释:
1 <—
/
2 3 <—
\
5 4 <—
重难点
广度优先遍历BFS
题目分析
- 定义存放二叉树的队列str,记录进队出队的顺序,每当一个节点已经将孩子节点都纪录到队列时,将该节点从队列中移除;
- 定义存放二叉树最右边节点arr;
- 从二叉树右边看第一个节点,就是广度优先遍历的最后一个值;
- len用于纪录当前层节点的数量,当所有节点的孩子都被纪录时,则可以开始遍历下一层的节点了;
- 返回arr。
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {number[]}
*/
var rightSideView = function(root) {
if(!root) return [];
//定义队列,用来放二叉树节点
let str = [];
str.push(root);
//记录最右边的节点
let arr = [];
while(str.length){
//将该层的第一个节点放入队列中
arr.push(str[0].val);
//节点数量
let len = str.length;
//遍历这一层的所有节点
while(len--){
//遍历到的当前节点,将它的孩子节点放入队列中(下一层),并将该节点出队
let lastNode = str.shift();
//孩子节点从右往左依次进队
if(lastNode.right) str.push(lastNode.right);
if(lastNode.left) str.push(lastNode.left);
}
}
return arr;
};