题目
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
思路
右视图就是每层的最右侧节点。
广度优先遍历,每层最后一个节点加入到列表中。
具体实现方法:
在广度优先的基础上,维护两个指针:
numsOfThisLevel: 代表 Queue 中本层的节点数,
numsOfNextLevel:代表 Queue 中下一层的节点数。
每当从队列中取出一个节点 node 时,numsOfThisLevel 减 1,
每当将 node 的左节点或者右节点加入队列是,numsOfNextLevel 加 1。
直到 numsOfThisLevel 为 0 是,这时 node 为本层最右侧节点,加入列表中,
并且将 numsOfThisLevel 下移一层(等于 numsOfNextLevel),
numsOfNextLevel 重置为 0.
复杂度分析
假设树有 n 个节点。
- 时间复杂度O(n),遍历整棵树。
- 空间复杂度O(n),空间复杂度与整棵树的节点数相关。
代码
class Solution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> res = new ArrayList<>();
bfs(root,res);
return res;
}
private static void bfs(TreeNode root, List<Integer> res) {
Queue<TreeNode> queue = new LinkedList<>();
if (root == null) {
return;
}
queue.add(root);
// 在队列中的节点个数
int numsOfThisLevel = 1;
int numsOfNextLevel = 0;
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
numsOfThisLevel--;
if (node.left != null) {
queue.offer(node.left);
numsOfNextLevel++;
}
if (node.right != null) {
queue.offer(node.right);
numsOfNextLevel++;
}
if (numsOfThisLevel == 0){
res.add(node.val);
numsOfThisLevel = numsOfNextLevel;
numsOfNextLevel = 0;
}
}
}
}