1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public List<Integer> rightSideView(TreeNode root) {
if (root == null)
return new ArrayList<>();
Queue<TreeNode> q = new LinkedList<>();
q.offer(root);
List<Integer> ans = new ArrayList<>();
while (!q.isEmpty()) {
int length = q.size();
TreeNode rightMostNode = q.peek();
ans.add(rightMostNode.val);
for (int i = 0; i < length; i++) {
TreeNode currentNode = q.poll();
if (currentNode.right != null)
q.offer(currentNode.right);
if (currentNode.left != null)
q.offer(currentNode.left);
}
}
return ans;
}
}

BFS, 但是装的时候先装右node, 再装左node. 一层一层往外pop. 每一层第一个pop出来的加入到ans中, 它就是该层最靠右的.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> ans = new ArrayList<>();
if (root == null)
return ans;
helper(ans, 0, root);
return ans;
}

private void helper(List<Integer> ans, int level, TreeNode node) {
if (ans.size() == level) {
ans.add(node.val);
}
if (node.right != null) {
helper(ans, level + 1, node.right);
}
if (node.left != null) {
helper(ans, level + 1, node.left);
}
}
}

这道题的启发就是正常的binary tree的dfs, 我们把node按照dfs的顺序存到一个list中, 那么对于每一层的node, 越靠左左边的node会越先被visit. 比如我们把某一层的node在list中标记出来, 这些node在该层的从左到右的相对顺序在list中仍然拥有相同的相对顺序, 维持不变. 只不过它们之间可能夹杂着其他的node, 但是在某层中靠左的node, 在list中也会靠左. 某一层的node间的相对顺序在list中也是一样.

时间复杂度: O(n) 要遍历所有的node.
空间复杂度: O(n) 可能是skewed tree.