「这是我参与2022首次更文挑战的第20天,活动详情查看:2022首次更文挑战」
题目介绍
给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例1
输入: [1,2,3,null,5,null,4]
输出: [1,3,4]
示例2
输入: [1,null,3]
输出: [1,3]
示例3
输入: []
输出: []
提示:
- 二叉树的节点个数的范围是
[0,100] -100 <= Node.val <= 100
解题思路
此题可以用深度优先和广度优先遍历出二叉树每一层的节点,然后将每一层最右边的节点按顺序插入到结果数组中,即可完成此题
广度优先
广度优先方法是利用队列保存上一层的所有节点,然后遍历上一层的所有节点,将每个节点左右子节点分别插入到队列中,当遍历完每一层的所有节点时,将最后的节点(也就是每一层最右边的节点)插入到结果数组中
解题步骤
- 如果此二叉树是空树,则直接返回
[] - 定义结果数组
res,定义存放每一层节点的队列queue,并将第一层的根节点root插入队列中 - 定义
n保存上一层的节点数,依次从queue队列中弹出n个节点,并将每个节点的左右节点插入到queue中 - 当遍历到每一层的最后一个节点时,将该节点的值插入到结果数组
res中 - 重复步骤 3-4,直到
queue队列为空,说明遍历完了整棵树,直接返回res数组即可
解题代码
var rightSideView = function(root) {
if (!root) return []
const res = []
let queue = [root]
while (queue.length) {
let n = queue.length
let node = null
while (n--) {
node = queue.shift()
node.left && queue.push(node.left)
node.right && queue.push(node.right)
}
res.push(node.val)
}
return res
};
深度优先
深度优先方法从二叉树的右子树开始遍历,如果结果数组对应层数的下标没有值,则将节点的值插入到结果数组中
解题步骤
- 如果此二叉树是空树,则直接返回
[] - 定义结果数组
ans,定义当前层数depth = 0 - 从根节点开始递归,如果
ans[depth]没有值,则将节点值插入到该位置 - 继续遍历右子树,层数
depth + 1 - 继续遍历左子树,层数
depth + 1 - 最后返回
ans数组
解题代码
var rightSideView = function(root) {
if (!root) return []
const ans = []
let depth = 0
dfs(root, depth, ans)
return ans
};
var dfs = function(root, k, ans) {
if (!ans[k]) ans[k] = root.val
root.right && dfs(root.right, k + 1, ans)
root.left && dfs(root.left, k + 1, ans)
}