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.
For example:
Given the following binary tree,
1 <--- / \ 2 3 <--- \ \ 5 4 <---
You should return [1, 3, 4]
.
Credits:
Special thanks to @amrsaqr for adding this problem and creating all test cases.
Show Similar Problems
Have you met this question in a real interview
思路: 法1 : Using pre order traverse the whole tree and storage the tree by level. Then, get the tail element of each level and add it to the list.
法2: Using dfs to traverse the tree, but every time we need to visit the right node.
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> ret = new ArrayList<Integer>();
List<List<Integer>> buffer = new ArrayList<List<Integer>>();
preOrder(root, 0, buffer);//preOrder traverse the tree and storage the tree node into list by level
for(List<Integer> level : buffer){
ret.add(level.get(level.size() - 1));
}
return ret;
}
private void preOrder(TreeNode root, int level, List<List<Integer>> buffer){
if(root == null)
return;
if(buffer.size() < level + 1){
buffer.add(new ArrayList<Integer>());
}
List<Integer> curLevel = buffer.get(level);
curLevel.add(root.val);
preOrder(root.left, level + 1, buffer);
preOrder(root.right, level + 1, buffer);
}
}
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> ret = new ArrayList<Integer>();
if(root == null)
return ret;
dfs(root, 0, ret);
return ret;
}
private void dfs(TreeNode root, int level, List<Integer> ret){
if(ret.size() < level + 1){
ret.add(root.val);
}
if(root.right != null)
dfs(root.right, level + 1, ret);
if(root.left != null)
dfs(root.left, level + 1, ret);
}
}