【題目】*199. 二叉樹的右視圖
給定一棵二叉樹,想象自己站在它的右側,按照從頂部到底部的順序,返回從右側所能看到的節點值。
示例:
輸入: [1,2,3,null,5,null,4]
輸出: [1, 3, 4]
解釋:
1 <---
/ \
2 3 <---
\ \
5 4 <---
【解題思路1】DFS
- 按照 「根結點 -> 右子樹 -> 左子樹」 的順序訪問,保證每層都是最先訪問最右邊的節點。(與先序遍歷 「根結點 -> 左子樹 -> 右子樹」 正好相反,先序遍歷每層最先訪問的是最左邊的節點)
- 如果當前節點所在深度還沒有出現在res裏,說明在該深度下當前節點是第一個被訪問的節點,因此將當前節點加入res中。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> res = new ArrayList<>();
dfs(root, res, 0);
return res;
}
public void dfs(TreeNode root, List<Integer> res, int level){
if(root == null){
return;
}
// 如果當前節點所在深度還沒有出現在res裏,說明在該深度下當前節點是第一個被訪問的節點,因此將當前節點加入res中。
if(res.size() == level){
res.add(root.val);
}
dfs(root.right, res, level+1);
dfs(root.left, res, level+1);
}
}
【解題思路2】BFS
將每層最後一個結點加入結果
class Solution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> res = new ArrayList<>();
if(root == null){
return res;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()){
int size = queue.size();
for(int i=0; i<size; i++){
TreeNode node = queue.poll();
if(node.left != null){
queue.offer(node.left);
}
if(node.right != null){
queue.offer(node.right);
}
if(i == size-1){ //當前層的最後一個結點
res.add(node.val);
}
}
}
return res;
}
}