一、题目
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例:
输入: [1,2,3,null,5,null,4]
输出: [1, 3, 4]
解释:
1 <---
/ \
2 3 <---
\ \
5 4 <---
二、实现
思路: 利用 BFS 进行层次遍历,记录下每层的最后一个元素。
时间复杂度: O(N)O(N),每个节点都入队出队了 1 次。
空间复杂度: O(N)O(N),使用了额外的队列空间。
每一个while循环,队列中存放的都是同一层的节点
获取队列中同一层节点的个数,然后依次遍历队列中同一层的节点,当遍历到该层最右边的节点时,将其存入结果集
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> res = new ArrayList<>();
if(root == null) return res;
//1. 创建队列
Queue<TreeNode> que = new LinkedList<>();
//2. 根节点入队
que.add(root);
//3. 层次遍历
while(!que.isEmpty()){
// 3.1 获取队列中所存的同一层节点的个数(此时队列中的节点都是同一层)
int size = que.size();
// 3.2 依次将同一层的节点出队
for(int i=0;i<size;i++){
TreeNode node = que.poll();
//将出队节点的左右孩子入队
if(node.left != null){
que.add(node.left);
}
if(node.right != null){
que.add(node.right);
}
// 判断当前节点是否是该层最右节点
if(i == size-1){
res.add(node.val);
}
}
}
//4. 返回结果
return res;
}
}