leetcode *199. 二叉樹的右視圖

【題目】*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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章