Problem:
Given a binary tree, imagine yourself standing on the right side of it, return the values of the nodes you can see ordered from top to bottom.
Input: [1,2,3,null,5,null,4]
Output: [1, 3, 4]
Explanation:
1 <-
/ \
2 3 <-
\ \
5 4 <-
Analysis:
method 1:
dfs:
we search the tree with the order of {root, right, left}. We will find that each time we go from the upper level to next level, the first TreeNode we hit is the Node we are looking for.
method 2:
bfs:
When scanning the tree (left -> right) from one level to the next level.
The last node in this level is the node we are looking for.
// dfs
public List<Integer> rightSideView(TreeNode root) {
List<Integer> res = new ArrayList<>();
dfsHelper(res, root, 0);
return res;
}
public void dfsHelper(List<Integer> res, TreeNode root, int level) {
if (root == null) return;
if (res.size() == level) {
res.add(root.val);
}
dfsHelper(res, root.right, level+1);
dfsHelper(res, root.left, level+1);
}
// bfs
public List<Integer> rightSideView1(TreeNode root){
List<Integer> res = new ArrayList<>();
if (root == null) {
return res;
}
Queue<TreeNode> q = new LinkedList<>();
q.offer(root);
while(!q.isEmpty()) {
int size = q.size();
for (int i=0; i<size; i++) {
TreeNode cur = q.poll();
if (i == size-1) {
res.add(cur.val);
}
if (cur.left != null) {
q.offer(cur.left);
}
if (cur.right != null) {
q.offer(cur.right);
}
}
}
return res;
}