199. 二叉树的右视图
给定一个二叉树的 根节点 root
,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例 1:
输入: [1,2,3,null,5,null,4]
输出: [1,3,4]
示例 2:
输入: [1,null,3]
输出: [1,3]
示例 3:
输入: []
输出: []
提示:
- 二叉树的节点个数的范围是
[0,100]
- − 100 ≤ N o d e . v a l ≤ 100 -100 \leq Node.val \leq 100 −100≤Node.val≤100
解法一(BFS+队列)
思路分析:
-
题目要求获取站在二叉树的左视图所看到的,二叉树的最右端结点,且按照从顶到底的顺序
-
按照从顶到底,我们采用二叉树的层序遍历,即可获得顶层到底层 每层结点所组成的列表
-
然后每层遍历得到的列表的末端值,即为每层的最右端结点,将其记录即可
实现代码如下:
class Solution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> ans = new ArrayList<>();
if (root == null)
return ans; // 考虑边界情况
Queue<TreeNode> queue = new ArrayDeque<>();
// 开始层序遍历
queue.offer(root);
while (!queue.isEmpty()) {
int size = queue.size();
// 定义在for循环之外 每次遍历一层二叉树结点后 会记录该层的最后一个结点
// 即记录每层的最右端结点
TreeNode node = null;
// 只需保存该层最末端的结点
for (int i = 0; i < size; ++ i) { // 将该层结点弹出 只保留最右端结点
node = queue.poll();
if (node.left != null)
queue.offer(node.left);
if (node.right != null)
queue.offer(node.right);
}
ans.add(node.val); // 将最右端结点记录
}
return ans;
}
}
提交结果如下:
解答成功:
执行耗时:1 ms,击败了83.59% 的Java用户
内存消耗:40.9 MB,击败了9.35% 的Java用户
复杂度分析:
-
时间复杂度: O ( n ) O(n) O(n)
-
空间复杂度: O ( n ) O(n) O(n)