题目描述
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
输入: [1,2,3,null,5,null,4]
输出: [1, 3, 4]
解释:
方法1:BFS,这个方法相比于DFS要好理解一些,每次记录每层的最右边的节点即可。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
//BFS方法
public List<Integer> rightSideView(TreeNode root) {
List<Integer> list = new ArrayList();
if(root == null)
return list;
LinkedList<TreeNode> queue = new LinkedList<>();
queue.addLast(root);
while(!queue.isEmpty()){
int size = queue.size();
for(int i = 0; i < size; i++){
TreeNode temp = queue.removeFirst();
if(i == size - 1){
list.add(temp.val);
}
if(temp.left != null){
queue.addLast(temp.left);
}
if(temp.right != null){
queue.addLast(temp.right);
}
}
}
return list;
}
}
方法二:DFS
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
//递归dfs
List<Integer> res = new ArrayList<>();
public List<Integer> rightSideView(TreeNode root) {
if(root == null)
return res;
dfs(root, 0);
return res;
}
private void dfs(TreeNode root, int depth){
if(root == null)
return;
if(depth == res.size()){
res.add(root.val);
}
depth++;
dfs(root.right, depth); //先访问右节点,再访问左节点,保证访问到的是最右边的节点值
dfs(root.left, depth);
}
}