一題多解 二元樹的右側視角Binary Tree Right Side View_Leetcode #199_精選75題

小松鼠-avatar-img
發佈於演算法題目解析 個房間
更新於 發佈於 閱讀時間約 7 分鐘

題目敘述

題目會給我們一顆二元樹的根結點,請我們列出每一層最右邊的節點值,以陣列的形式返回答案。


題目的原文敘述


測試範例

Example 1:

raw-image
Input: root = [1,2,3,null,5,null,4]
Output: [1,3,4]
每一層最右邊的節點值分別是1, 3, 4

Example 2:

Input: root = [1,null,3]
Output: [1,3]
每一層最右邊的節點值分別是1, 3

Example 3:

Input: root = []
Output: []
空樹,回傳空陣列即可。​

約束條件

Constraints:

  • The number of nodes in the tree is in the range [0, 100].

節點總數介於0 ~ 100之間。

所以實作時要留意一個小細節,邊界條件的處理,題目可能會給我們一顆空樹喔!

  • -100 <= Node.val <= 100

節點值介於-100 ~ 100之間。


演算法 BFS

其實解題線索就藏在題目裡了!

題目說請我們想像站在這顆樹的右邊,看看這個樹,列出每一層最右邊的節點。

關鍵字是"每一層",那很自然就會聯想到逐層遍歷的Level-order traversal,或者說

我們把樹視為一張圖Graph,從root node開始由上往下逐層拜訪整顆樹。


根據題意的需求,我們只要每層都保持由右向左訪問順序,很自然,每一層的第一顆節點就是我們所需要的Right side view nodes,右側視角的節點,把節點值依序記錄下來,以陣列的形式回傳答案即可。

image.png

image.png


程式碼 BFS

class Solution:
def rightSideView(self, root: Optional[TreeNode]) -> List[int]:

# Quick response on empty tree
if not root:
return []

# Starting point is root node
bfs_q = deque([root])
view = []

# Launch level-order traversal from right-hand side to left-hand side
while bfs_q:

# First node on current level is the node of right-side view
view.append( bfs_q[0].val )

# Add child node from right to left
for _ in range( len(bfs_q) ):
cur = bfs_q.popleft()
cur.right and bfs_q.append( cur.right)
cur.left and bfs_q.append( cur.left)

return view

複雜度分析 BFS

令n=節點總數目

時間複雜度:

從根結點開始拜訪整棵樹,每個節點至多訪問一次,總共所需時間為O(n)。

空間複雜度:

BFS queue的長度,每個節點至多訪問一次,總共所需空間為O(n)。


演算法 DFS

還有另一種解法,用深度優先也可以。

題目說請我們想像站在這顆樹的右邊,看看這個樹,列出每一層最右邊的節點。


根據題意的需求,我們只要每一層DFS都保持由右向左訪問順序,先走訪問右子樹,再訪問左子樹,很自然,每一層的第一顆節點就是我們所需要的Right side view nodes,右側視角的節點,把節點值依序記錄下來,以陣列的形式回傳答案即可。


程式碼 DFS

from collections import defaultdict

class Solution:
def rightSideView(self, root: TreeNode) -> List[int]:

if not root:
# Quick response for empty tree
return []

# key: depth
# value: value of right-most node
self.side_view_dict = defaultdict( int )
self.max_depth = 0

def helper( node: TreeNode, depth: int):

if node:

if self.side_view_dict.get(depth, None) == None:
self.side_view_dict[depth] = node.val

self.max_depth = max( self.max_depth, depth)

# Let right sub-tree go before left sub-tree in order to get right side view
helper( node.right, depth+1 )
helper( node.left, depth+1 )

# ----------------------------------------
helper( node = root, depth = 0 )
return [ self.side_view_dict[depth] for depth in range(0, self.max_depth+1) ]


複雜度分析 DFS

令n=節點總數目

時間複雜度:

從根結點開始拜訪整棵樹,每個節點至多訪問一次,總共所需時間為O(n)。

空間複雜度:

DFS recursion stack的深度,每個節點至多訪問一次,總共所需空間為O(n)。


關鍵知識點

條條大路通羅馬,只要掌握基本原理,遇到新的題目也能根據基本的圖論演算法DFS、BFS配合題意的需求去構建出解題的演算法


另外,還有一個衍伸題,假如題目問我們左側視角 Left side view? 要怎麼改?

也很容易,把拜訪順序改成從左到右,取每一層第一個遇到的節點值,就可以囉!


Reference:

[1] Binary right side view by DFS // BFS

留言
avatar-img
留言分享你的想法!
螃蟹_crab-avatar-img
2024/01/26
每次觀看都有種膜拜大神的感覺,太厲害了
小松鼠-avatar-img
發文者
2024/05/29
小松鼠-avatar-img
發文者
2024/01/27
我練習AI project的時候 也參考很多你分享的資料
avatar-img
小松鼠的演算法樂園
95會員
427內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
2024/09/26
Leetcode 729. My Calendar I 給定一個行事曆的class定義和行程安排的介面interface。 請完成下列function 1.建構子MyCalendar() 初始化MyCalendar物件 2.boolean book(int start, int end) 插入新行程
Thumbnail
2024/09/26
Leetcode 729. My Calendar I 給定一個行事曆的class定義和行程安排的介面interface。 請完成下列function 1.建構子MyCalendar() 初始化MyCalendar物件 2.boolean book(int start, int end) 插入新行程
Thumbnail
2024/09/10
Insert Greatest Common Divisors in Linked List 題目給定一個鏈結串列, 請在兩兩節點之間加入一個新節點,新節點的值為兩者之間的最大公因數。 最後返回新串列的head node作為答案。
Thumbnail
2024/09/10
Insert Greatest Common Divisors in Linked List 題目給定一個鏈結串列, 請在兩兩節點之間加入一個新節點,新節點的值為兩者之間的最大公因數。 最後返回新串列的head node作為答案。
Thumbnail
2024/09/09
2326. Spiral Matrix IV 題目給定一個Linked list和對應的矩陣高度m、寬度n。 請依照順時針的拜訪順序, 從左上角出發,依照次序把Linked List的內容填到矩陣裡。 如果有剩餘不足的空位,就填補-1。 最後將填補好的矩陣返回作為答案。
Thumbnail
2024/09/09
2326. Spiral Matrix IV 題目給定一個Linked list和對應的矩陣高度m、寬度n。 請依照順時針的拜訪順序, 從左上角出發,依照次序把Linked List的內容填到矩陣裡。 如果有剩餘不足的空位,就填補-1。 最後將填補好的矩陣返回作為答案。
Thumbnail
看更多
你可能也想看
Thumbnail
大家好,我是一名眼科醫師,也是一位孩子的媽 身為眼科醫師的我,我知道視力發展對孩子來說有多關鍵。 每到開學季時,診間便充斥著許多憂心忡忡的家屬。近年來看診中,兒童提早近視、眼睛疲勞的案例明顯增加,除了3C使用過度,最常被忽略的,就是照明品質。 然而作為一位媽媽,孩子能在安全、舒適的環境
Thumbnail
大家好,我是一名眼科醫師,也是一位孩子的媽 身為眼科醫師的我,我知道視力發展對孩子來說有多關鍵。 每到開學季時,診間便充斥著許多憂心忡忡的家屬。近年來看診中,兒童提早近視、眼睛疲勞的案例明顯增加,除了3C使用過度,最常被忽略的,就是照明品質。 然而作為一位媽媽,孩子能在安全、舒適的環境
Thumbnail
我的「媽」呀! 母親節即將到來,vocus 邀請你寫下屬於你的「媽」故事——不管是紀錄爆笑的日常,或是一直想對她表達的感謝,又或者,是你這輩子最想聽她說出的一句話。 也歡迎你曬出合照,分享照片背後的點點滴滴 ♥️ 透過創作,將這份情感表達出來吧!🥹
Thumbnail
我的「媽」呀! 母親節即將到來,vocus 邀請你寫下屬於你的「媽」故事——不管是紀錄爆笑的日常,或是一直想對她表達的感謝,又或者,是你這輩子最想聽她說出的一句話。 也歡迎你曬出合照,分享照片背後的點點滴滴 ♥️ 透過創作,將這份情感表達出來吧!🥹
Thumbnail
題目敘述 題目會給定一棵二元樹的根結點,要求我們找出這棵二元樹最後一層最左邊的值。 題目的原文敘述 測試範例 Example 1: Input: root = [2,1,3] Output: 1 Example 2: Input: root = [1,2,3,4,null,5,6
Thumbnail
題目敘述 題目會給定一棵二元樹的根結點,要求我們找出這棵二元樹最後一層最左邊的值。 題目的原文敘述 測試範例 Example 1: Input: root = [2,1,3] Output: 1 Example 2: Input: root = [1,2,3,4,null,5,6
Thumbnail
題目敘述 題目會給我們一棵BST二元搜索樹的根結點root,還有一個指定的目標值key。 要求我們在樹中刪除帶有這個key值的節點,並且返回更新過後二元搜索樹的樹根root。 題目的原文敘述 測試範例 Example 1: Input: root = [5,3,6,2,4,null,
Thumbnail
題目敘述 題目會給我們一棵BST二元搜索樹的根結點root,還有一個指定的目標值key。 要求我們在樹中刪除帶有這個key值的節點,並且返回更新過後二元搜索樹的樹根root。 題目的原文敘述 測試範例 Example 1: Input: root = [5,3,6,2,4,null,
Thumbnail
題目敘述 題目會給我們一顆二元樹的根結點,請我們列出每一層最右邊的節點值,以陣列的形式返回答案。 題目的原文敘述 測試範例 Example 1: Input: root = [1,2,3,null,5,null,4] Output: [1,3,4] 每一層最右邊的節點值分別是1, 3,
Thumbnail
題目敘述 題目會給我們一顆二元樹的根結點,請我們列出每一層最右邊的節點值,以陣列的形式返回答案。 題目的原文敘述 測試範例 Example 1: Input: root = [1,2,3,null,5,null,4] Output: [1,3,4] 每一層最右邊的節點值分別是1, 3,
Thumbnail
題目敘述 題目會給定我們一顆二元搜索樹BST的根結點, 還有一個指定區間的上邊界R 和 下邊界L。 請問二元搜索樹中,所有落在指定區間內的節點元素值的總和是多少? 題目的原文敘述 測試範例 Example 1: Input: root = [10,5,15,3,7,null,18], l
Thumbnail
題目敘述 題目會給定我們一顆二元搜索樹BST的根結點, 還有一個指定區間的上邊界R 和 下邊界L。 請問二元搜索樹中,所有落在指定區間內的節點元素值的總和是多少? 題目的原文敘述 測試範例 Example 1: Input: root = [10,5,15,3,7,null,18], l
Thumbnail
題目會給一顆二元樹,要求我們計算節點值 和 子樹平均值相等的node有幾個。
Thumbnail
題目會給一顆二元樹,要求我們計算節點值 和 子樹平均值相等的node有幾個。
Thumbnail
題目會給我們一顆二元樹的根結點,要求我們找出每一層最大的節點值。
Thumbnail
題目會給我們一顆二元樹的根結點,要求我們找出每一層最大的節點值。
Thumbnail
題目會給我們節點總數目n、左子樹的關係陣列、右子樹的關係陣列,要求我們驗證在給定的條件下,能不能構成一顆合法的二元樹。
Thumbnail
題目會給我們節點總數目n、左子樹的關係陣列、右子樹的關係陣列,要求我們驗證在給定的條件下,能不能構成一顆合法的二元樹。
Thumbnail
題目會給定給我們一顆二元樹的根結點, 要求我們輸出上下顛倒的Level-order traversal的拜訪結果。
Thumbnail
題目會給定給我們一顆二元樹的根結點, 要求我們輸出上下顛倒的Level-order traversal的拜訪結果。
Thumbnail
題目會給我們一顆二元樹的根節點, 要求我們對齊根節點正中央的虛擬分割線,反轉整顆二元樹。
Thumbnail
題目會給我們一顆二元樹的根節點, 要求我們對齊根節點正中央的虛擬分割線,反轉整顆二元樹。
Thumbnail
Leetcode #100: Same Tree 題目會給定兩棵Binary Tree的根結點,要求我們判斷兩棵樹是否一模一樣。 也就是說,形狀相同,節點的數值也相同。
Thumbnail
Leetcode #100: Same Tree 題目會給定兩棵Binary Tree的根結點,要求我們判斷兩棵樹是否一模一樣。 也就是說,形狀相同,節點的數值也相同。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News