199. 二叉树的右视图 【中等题】【层次遍历】
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
输入: [1,2,3,null,5,null,4]
输出: [1, 3, 4]
解释:
1 <---
/ \
2 3 <---
\ \
5 4 <---
题目讲解
解法1:迭代解法
【核心思想】
- 参考题目:《二叉树的层次遍历》
- 借助队列实现层次遍历
- 将每一层最右边一个结点的
val
取出放入list
即可
【数据结构】
- 队列
【思路】
- 先将根结点放入队列
queue
中 - 然后遍历
queue
,依次pop
,将弹出结点的左右子节点依次加入queue
- 当
i==queue.size()-1
的时候,就是这一层的最右边一个结点
【代码】
public List<Integer> rightSideView(TreeNode root) {
if(root==null)
return new ArrayList<>();
Queue<TreeNode> queue=new ArrayDeque<>();
List<Integer> list=new ArrayList<>();
queue.add(root);
while(!queue.isEmpty()){
int len=queue.size();
for(int i=0;i<len;i++){
TreeNode temp=queue.poll();
if(i==len-1)
list.add(temp.val);
if(temp.left!=null)
queue.add(temp.left);
if(temp.right!=null)
queue.add(temp.right);
}
}
return list;
}
【备注】
- 如果在加入到
queue
时先加入右结点,再加入左结点,那么可以不用判断i==queue.size()-1
,直接在while
的开头就加入list
public List<Integer> rightSideView(TreeNode root) {
if(root==null)
return new ArrayList<>();
Queue<TreeNode> queue=new ArrayDeque<>();
List<Integer> list=new ArrayList<>();
queue.add(root);
while(!queue.isEmpty()){
list.add(queue.peek().val);
int len=queue.size();
for(int i=0;i<len;i++){
TreeNode temp=queue.poll();
if(temp.right!=null)
queue.add(temp.right);
if(temp.left!=null)
queue.add(temp.left);
}
}
return list;
}
解法2:递归解法
【核心思想】
- 每一层只有一个结点的
val
需要加入list
,所以可以用一个变量level
控制
【思路】
- 在调用递归函数时,先调度用右结点,再调用左结点
- 当
level == ans.size()
,即已经遇到了这一层最右边的结点,将其val
加入list
即可
【代码】
List<Integer> list = new ArrayList<>();
public List<Integer> rightSideView(TreeNode root) {
help(root, 0);
return list;
}
void help(TreeNode root, int level) {
if (root == null)
return;
if (level == list.size())
list.add(root.val);
help(root.right, level + 1);
help(root.left, level + 1);
}
关注微信公众号“算法岗从零到无穷”,更多算法知识点告诉你。