class Solution {
public List rightSideView(TreeNode root) {
//所谓二叉树的右侧视图就是二叉树每一层最右边节点的值
//那么既然涉及到二叉树的层的概念很自然的就使用二叉树的层次遍历
//为了区分二叉树的每一层我们的办法就是使用两个队列来区分二叉树的每一层
//首先两个初始化队列,其中一个队列的初始值为root节点,下层队列的初始值为空
if(root == null){
return new ArrayList();
}
Queue queue1 = new linkedList();
queue1.offer(root);
Queue queue2 = new linkedList<>();
ArrayList result = new ArrayList<>();
//双队列层次遍历
while(!queue1.isEmpty()){
//遍历每一个节点时需要先记录下每一个节点将其从queue1中删除
TreeNode node = queue1.poll();
//判断其是否右左右节点,有就放入到queue2
if(node.left != null){
queue2.offer(node.left);
}
if(node.right != null){
queue2.offer(node.right);
}
//当queue1为空时,使用queue2置换queue1,queue2初始化为新的队列,这个时候的node时上一个队列的最右节点需要记录下来
if(queue1.isEmpty()){
queue1 = queue2;
queue2 = new linkedList<>();
result.add(node.val);
}
}
return result;
}
}