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

閱讀時間約 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

82會員
417Content count
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
題目敘述 題目會給定我們一個字串s,和一組字庫wordDict。 問我們能不能透過字串串接的方式,從字庫裡面的字拼成原本的字串s? 可以的話,返回True。 無解的話,返回False。 註: 題目還允許重複使用字庫裡面的字去串接。
題目敘述 題目會給定一個指定高度和寬的方格版,還有一顆小球的起始位置,和最大移動步數。 小球每一步可以選擇向上、下、左、右移動一格,請問小球能走到方格版界外的路徑方法數總共有幾種? 方法數可能很大,題目要求,最後回傳答案時,先對10^9+7做除法取餘數再回傳。 題目的原文敘述 約束條件
題目敘述 題目會給定一個字串陣列arr最為輸入,我們可以任意選擇一組不包含重複字元的陣列子序列,將字串進行串接,成為字串s,請問字串s的最大長度是多少? 例如: arr=["dog","cow","cat"] 我們可以選擇"dog", "cat"進行串接,得到的字串s="dogcat",s的
題目敘述 題目會給定我們一棵二元數Binary Tree的根結點。 問我們任意祖先節點和晚輩節點之間,最大的差值的絕對值是多少? 題目的原文敘述 測試範例 Example 1: Input: root = [8,3,10,1,6,null,14,null,null,4,7,13] Ou
題目敘述 題目會給定我們一棵二元數Binary Tree的根結點。 並且給定感染的病毒源節點位置,每個單位時間,可以向相鄰的節點感染一次,問我們需要多少時間去感染整棵樹? 題目的原文敘述 測試範例 Example 1: Input: root = [1,5,3,null,4,10,6,
題目敘述 題目會給我們一個輸入陣列prerequisites,每個pair代表兩個課程之間的先修關係,和課程總數numCourses。 題目問我們這組課程表是否能依照順序修完所有的課程? 如果可以,返回True。 如果不行,代表有擋修形成死結,無法依照順序修完所有的課程,返回False。
題目敘述 題目會給定我們一個字串s,和一組字庫wordDict。 問我們能不能透過字串串接的方式,從字庫裡面的字拼成原本的字串s? 可以的話,返回True。 無解的話,返回False。 註: 題目還允許重複使用字庫裡面的字去串接。
題目敘述 題目會給定一個指定高度和寬的方格版,還有一顆小球的起始位置,和最大移動步數。 小球每一步可以選擇向上、下、左、右移動一格,請問小球能走到方格版界外的路徑方法數總共有幾種? 方法數可能很大,題目要求,最後回傳答案時,先對10^9+7做除法取餘數再回傳。 題目的原文敘述 約束條件
題目敘述 題目會給定一個字串陣列arr最為輸入,我們可以任意選擇一組不包含重複字元的陣列子序列,將字串進行串接,成為字串s,請問字串s的最大長度是多少? 例如: arr=["dog","cow","cat"] 我們可以選擇"dog", "cat"進行串接,得到的字串s="dogcat",s的
題目敘述 題目會給定我們一棵二元數Binary Tree的根結點。 問我們任意祖先節點和晚輩節點之間,最大的差值的絕對值是多少? 題目的原文敘述 測試範例 Example 1: Input: root = [8,3,10,1,6,null,14,null,null,4,7,13] Ou
題目敘述 題目會給定我們一棵二元數Binary Tree的根結點。 並且給定感染的病毒源節點位置,每個單位時間,可以向相鄰的節點感染一次,問我們需要多少時間去感染整棵樹? 題目的原文敘述 測試範例 Example 1: Input: root = [1,5,3,null,4,10,6,
題目敘述 題目會給我們一個輸入陣列prerequisites,每個pair代表兩個課程之間的先修關係,和課程總數numCourses。 題目問我們這組課程表是否能依照順序修完所有的課程? 如果可以,返回True。 如果不行,代表有擋修形成死結,無法依照順序修完所有的課程,返回False。
你可能也想看
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
120周守住可以買回我們2020獲利在32~45的1/3持股操作 之前叫#展旺 等確定站穩就開始規劃 也是在生技展前會積極操作之前沒獲利過的,就自己看生技的投資組合做配置 主要題材 抗生素有機會被炒作為缺藥的消息面 戰爭+中國爆發黴漿菌純粹就是想像力 就像2020疫情風暴 我們19
Thumbnail
昨天自己又測試了一下,感覺還是有優化的空間,又做了一些細微調整,目前我認為這個版本非常強悍了。
Thumbnail
有一次在家裡整理東西時,我的貓嚇到我了。因為當時就只有我一個人在家,所以非常的安靜。那你可能會想,貓咪走路不都沒有聲音的嗎?沒錯,正因為牠們走路都沒有聲音所以才更嚇人,因為當時並不曉得貓咪從自己後方走過來,完全沒有腳步聲的狀況下,只聽到了一個聲音,那就是呼吸聲。當下聽到急促的呼吸聲也沒有聯想到是自己
Thumbnail
「醫師啊,我從前體檢的血糖好像有一點超標,算不算糖尿病?需要再驗嗎?我平時都沒有不舒服,應該沒關係吧!」一到診間坐下,中年大叔就開口詢問:「我應該是健康的胖子,雖然這顆肚子消不下來,不過假日都有出門散步運動,體力還不錯。」語畢,滿意地拍拍自己的肚子。
Thumbnail
l 政府的教育目的到底是什麼? l 錯誤的目的、心態導致後面一連串的錯誤 l 我們可以如何跨出去?
Thumbnail
民事案件:不動產「借名登記」問題多!借名登記探究(一)-內部關係 不動產借名登記契約是否有效?是否違反民法上強制及禁止規定?如若有效,則不動產借名登記契約的性質為何?是消極信託還是類推適用民法的委任契約條文?
Thumbnail
童文薰律師在童溫層節目中整理出蔡英文一魚多吃的記錄 我其實蠻意外,在童文薰律師揭露蔡英文論文原稿一魚多吃之後,御用媒體會真的當回事發報導洗白的;因為這真的不是一般人會關心的事。但《芋傳媒》還真的引用了一個臉書粉專:《翻譯有要緊》的貼文煞有介事的這麼做了。
Thumbnail
本所許健鈴律師主持【歡迎搭乘,喜麗詩號】,從李佳庭社工的《你不伸手,他會在這裡躺多久?:一個年輕社工的掙扎與淚水》,談談幾個跟街友相關的法律問題。
Thumbnail
●2017印尼電影【愛的所有格 Posesif】有一種愛叫佔有 (普特莉馬利諾 阿迪帕提多肯 葛莉瑟達阿嘉莎 奇可庫尼阿萬) 這張海報跟在HamiVedio付費頻道【愛的所有格 Posesif】的預告片,是讓我驚豔的。
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
120周守住可以買回我們2020獲利在32~45的1/3持股操作 之前叫#展旺 等確定站穩就開始規劃 也是在生技展前會積極操作之前沒獲利過的,就自己看生技的投資組合做配置 主要題材 抗生素有機會被炒作為缺藥的消息面 戰爭+中國爆發黴漿菌純粹就是想像力 就像2020疫情風暴 我們19
Thumbnail
昨天自己又測試了一下,感覺還是有優化的空間,又做了一些細微調整,目前我認為這個版本非常強悍了。
Thumbnail
有一次在家裡整理東西時,我的貓嚇到我了。因為當時就只有我一個人在家,所以非常的安靜。那你可能會想,貓咪走路不都沒有聲音的嗎?沒錯,正因為牠們走路都沒有聲音所以才更嚇人,因為當時並不曉得貓咪從自己後方走過來,完全沒有腳步聲的狀況下,只聽到了一個聲音,那就是呼吸聲。當下聽到急促的呼吸聲也沒有聯想到是自己
Thumbnail
「醫師啊,我從前體檢的血糖好像有一點超標,算不算糖尿病?需要再驗嗎?我平時都沒有不舒服,應該沒關係吧!」一到診間坐下,中年大叔就開口詢問:「我應該是健康的胖子,雖然這顆肚子消不下來,不過假日都有出門散步運動,體力還不錯。」語畢,滿意地拍拍自己的肚子。
Thumbnail
l 政府的教育目的到底是什麼? l 錯誤的目的、心態導致後面一連串的錯誤 l 我們可以如何跨出去?
Thumbnail
民事案件:不動產「借名登記」問題多!借名登記探究(一)-內部關係 不動產借名登記契約是否有效?是否違反民法上強制及禁止規定?如若有效,則不動產借名登記契約的性質為何?是消極信託還是類推適用民法的委任契約條文?
Thumbnail
童文薰律師在童溫層節目中整理出蔡英文一魚多吃的記錄 我其實蠻意外,在童文薰律師揭露蔡英文論文原稿一魚多吃之後,御用媒體會真的當回事發報導洗白的;因為這真的不是一般人會關心的事。但《芋傳媒》還真的引用了一個臉書粉專:《翻譯有要緊》的貼文煞有介事的這麼做了。
Thumbnail
本所許健鈴律師主持【歡迎搭乘,喜麗詩號】,從李佳庭社工的《你不伸手,他會在這裡躺多久?:一個年輕社工的掙扎與淚水》,談談幾個跟街友相關的法律問題。
Thumbnail
●2017印尼電影【愛的所有格 Posesif】有一種愛叫佔有 (普特莉馬利諾 阿迪帕提多肯 葛莉瑟達阿嘉莎 奇可庫尼阿萬) 這張海報跟在HamiVedio付費頻道【愛的所有格 Posesif】的預告片,是讓我驚豔的。