199. 二叉树的右视图 🟨
题目
LeetCode 中等
题目
给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例 1:
输入: [1,2,3,null,5,null,4]
输出: [1,3,4]

示例 2:
输入:root = [1,2,3,4,null,null,null,5]
输出:[1,3,4,5]

题解
方法:广度优先
BFS 队列
每一层最后一个节点
- 时间复杂度:O(n)
- 空间复杂度:O(n)
js
class TreeNode {
constructor(val, left = null, right = null) {
this.val = val
this.left = left
this.right = right
}
}
function rightSideViewBFS(root) {
if (!root) return []
const vals = []
const queue = [root]
while (queue.length) {
console.log(
'♻️',
queue.map(i => i.val),
)
let len = queue.length
while (len) {
let node = queue.shift()
if (len === 1) vals.push(node.val)
if (node.left) queue.push(node.left)
if (node.right) queue.push(node.right)
len--
console.log(
'node',
node.val,
'queue',
queue.map(i => i.val),
)
}
console.log('📌 层遍历结束', vals)
}
return vals
}
const tree = new TreeNode(1)
tree.left = new TreeNode(2, null, new TreeNode(5))
tree.right = new TreeNode(3, null, new TreeNode(4))
console.log('🌰', JSON.stringify(rightSideViewBFS(tree)))
执行结果
♻️ [1]
node 1 queue [2,3]
📌 层遍历结束 [1]
♻️ [2,3]
node 2 queue [3,5]
node 3 queue [5,4]
📌 层遍历结束 [1,3]
♻️ [5,4]
node 5 queue [4]
node 4 queue []
📌 层遍历结束 [1,3,4]
🌰 [1,3,4]
方法:深度优先
DFS 递归
根右左,每一层的第一个结点
- 时间复杂度:O(n)
- 空间复杂度:O(n)
js
class TreeNode {
constructor(val, left = null, right = null) {
this.val = val
this.left = left
this.right = right
}
}
function rightSideViewDFS(root) {
if (!root) return []
let res = []
const dfs = (node, depth) => {
console.log('♻️ node:', node?.val, 'depth:', depth)
if (depth === res.length) {
res.push(node.val)
console.log('res:', res)
}
depth++
if (node.right) dfs(node.right, depth)
if (node.left) dfs(node.left, depth)
}
dfs(root, 0)
return res
}
const tree = new TreeNode(1)
tree.left = new TreeNode(2, new TreeNode(4, new TreeNode(5)))
tree.right = new TreeNode(3)
console.log('🌰', JSON.stringify(rightSideViewDFS(tree)))
执行结果
♻️ node: 1 depth: 0
res: [1]
♻️ node: 3 depth: 1
res: [1,3]
♻️ node: 2 depth: 1
♻️ node: 4 depth: 2
res: [1,3,4]
♻️ node: 5 depth: 3
res: [1,3,4,5]
🌰 [1,3,4,5]