关注
文末的名片达文汐
,回复关键词“力扣源码”,即可获取完整源码!!详见:源码和核心代码的区别
题目详情
给定一个二叉树的根节点 root
,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例 1:
输入:root = [1,2,3,null,5,null,4]
输出:[1,3,4]
解释:
示例 2:
输入:root = [1,2,3,4,null,null,null,5]
输出:[1,3,4,5]
解释:
示例 3:
输入:root = [1,null,3]
输出:[1,3]
示例 4:
输入:root = []
输出:[]
提示:
- 二叉树的节点个数的范围是
[0,100]
-100 <= Node.val <= 100
解题思路
核心思路:层次遍历(BFS)
从右侧观察二叉树时,每层最右边的节点即为可见节点。使用广度优先搜索(BFS)进行层次遍历,记录每层的最后一个节点值:
- 初始化队列:将根节点加入队列。
- 层次遍历:
- 每次处理一层节点,记录当前层的节点数量
size
。 - 遍历当前层所有节点,将左右子节点加入队列。
- 记录当前层最后一个节点的值(即最右侧节点)。
- 每次处理一层节点,记录当前层的节点数量
- 构建结果:将每层的最右侧节点值加入结果列表。
时间复杂度:O(N),每个节点访问一次。
空间复杂度:O(N),队列最多存储 N 个节点(N 为节点总数)。
代码实现(Java版)
import java.util.*;
class Solution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> result = new ArrayList<>();
if (root == null) {
return result;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root); // 根节点入队
while (!queue.isEmpty()) {
int size = queue.size(); // 当前层节点数
for (int i = 0; i < size; i++) {
TreeNode node = queue.poll(); // 弹出当前节点
if (i == size - 1) { // 当前层最后一个节点(最右侧)
result.add(node.val);
}
// 将左右子节点加入队列
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
}
}
return result;
}
}
代码说明
- 初始化:若根节点为空,直接返回空列表。
- 队列操作:
queue.offer(root)
:根节点入队。queue.poll()
:弹出当前节点。queue.offer(child)
:将子节点加入队列。
- 层次遍历:
- 外层循环处理每一层。
- 内层循环遍历当前层所有节点,通过
size
控制遍历范围。
- 记录结果:内层循环中,当
i == size - 1
(即当前层最后一个节点)时,将其值加入结果列表。