题目描述

给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

输入输出

1
2
3
4
5
6
7
8
输入: [1,2,3,null,5,null,4]
输出: [1,3,4]

输入: [1,null,3]
输出: [1,3]

输入: []
输出: []

基本思路

方法一:广搜(层次遍历) 使用一个list保存每一层的最后一个值

方法二:深搜 搜索过程中 总是先访问右子树 那么对于每一层来说 在这层见到的第一个结点一定是最右边的结点

时复空复都是 $O(n)$

java实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// 广搜
class Solution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> res = new ArrayList<Integer>();
if(root == null) return res;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(root);
while(!queue.isEmpty()){
int size = queue.size();
for(int i = 0; i < size; i++){
TreeNode tmp = queue.poll();
if(tmp.left != null){
queue.offer(tmp.left);
}
if(tmp.right != null){
queue.offer(tmp.right);
}
if(i == size - 1) res.add(tmp.val);
}
}
return res;
}
}

// 深搜
class Solution {
List<Integer> res = new ArrayList<Integer>();
public List<Integer> rightSideView(TreeNode root) {
dfs(root, 0);
return res;
}

public void dfs(TreeNode root, int depth){
if(root == null) return;
// 先访问 当前节点,再递归地访问 右子树 和 左子树
if(depth == res.size()){
// 当前节点所在深度还没有出现在res里 说明在该深度下当前节点是第一个被访问的节点
// 因此将当前节点加入res中
res.add(root.val);
}
depth++;
dfs(root.right, depth);
dfs(root.left, depth);
}
}