Leetcode每日一題-二叉樹的右視圖

給定一棵二叉樹,想象自己站在它的右側,按照從頂部到底部的順序,返回從右側所能看到的節點值。

示例:

輸入: [1,2,3,null,5,null,4]
輸出: [1, 3, 4]
解釋:

   1            <---
 /   \
2     3         <---
 \     \
  5     4       <---

解題思路

樹的遍歷,題目要求返回樹最又層的那一列,首先想到的是DFS和BFS,因為不知道每個分支的深度,所以在DFS深度遍歷時,要記得當前深度有沒有記錄過最右邊的節點,同理在BFS寬度遍歷時,也要確保最右側的節點被記錄過。

DFS解法

class Solution {
    public List<Integer> rightSideView(TreeNode root) {

        List<Integer> list = new ArrayList<Integer>();
        int depth = 0;
        dfs(list,root,depth);
        return list;
    }

    private void dfs(List<Integer> list,TreeNode root,int depth)
    {
        if(root != null)
        {
            if(depth == list.size())
            {
                list.add(root.val);
            }
            depth++;
            dfs(list,root.right,depth);//優先訪問右側節點
            dfs(list,root.left,depth);
        }
    }
}

BFS解法

class Solution {
   
    public List<Integer> rightSideView(TreeNode root){
        List<Integer> list = new ArrayList<Integer>();

        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        if(root == null) return list;

        queue.offer(root);

        while(!queue.isEmpty())
        {
            //獲取一層中最右邊的那個節點
            int size = queue.size();  //提前算出來大小,因為大小時刻在變
            for(int i=0;i<size;i++)
            {
                TreeNode node = queue.poll();
                if(i == size -1)
                {
                    if(node != null) list.add(node.val);
                }
                if(node.left != null) queue.offer(node.left);
                if(node.right != null) queue.offer(node.right);
            }

        }

        return list;
    }
}

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/binary-tree-right-side-view
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容