DFS應用題 計算與子樹平均值相等的節點數 Leetcode #2265

閱讀時間約 4 分鐘
raw-image

題目敘述

題目會給一顆二元樹,要求我們計算節點值 和 子樹平均值相等的node有幾個。

詳細的題目敘述在這裡:


測試範例

Example 1:

raw-image
Input: root = [4,8,5,0,1,null,6]
Output: 5
Explanation:
For the node with value 4: The average of its subtree is (4 + 8 + 5 + 0 + 1 + 6) / 6 = 24 / 6 = 4.
For the node with value 5: The average of its subtree is (5 + 6) / 2 = 11 / 2 = 5.
For the node with value 0: The average of its subtree is 0 / 1 = 0.
For the node with value 1: The average of its subtree is 1 / 1 = 1.
For the node with value 6: The average of its subtree is 6 / 1 = 6.

Example 2:

raw-image
Input: root = [1]
Output: 1
Explanation: For the node with value 1: The average of its subtree is 1 / 1 = 1.

約束條件

Constraints:

  • The number of nodes in the tree is in the range [1, 1000].
  • 0 <= Node.val <= 1000

演算法

抽象來想,對於當下節點來說,需要知道下列資訊來滿足題目要求的計算

  1. 子樹的結點值總和
  2. 子樹的valid count (就是子樹內部,節點值=子樹平均值的node count)
  3. 子樹的總結點數(因為平均 = 子樹結點值總和/子樹總結點數,我們會需要分子和分母的確切數值)


依循這個思路,設計DFS 遞迴function,以bottom-up 由下往上的方式,回傳 上述三個參數給parent node,逐層計算節點值 和 子樹平均值相等的node有幾個。


程式碼

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

   if not root:
    # node value, valid count, total node count
    return 0, 0, 0
   
   l_sum, l_valid, l_nodes = helper(root.left)

   r_sum, r_valid, r_nodes = helper(root.right)

   # Average = (root + left subtree + right subtree) / subtree node count
   avg = (root.val + l_sum + r_sum) // (1 + l_nodes + r_nodes )

   if root.val == avg:
    return l_sum + r_sum + root.val, l_valid + r_valid + 1, l_nodes + r_nodes + 1
   
   else:
    return l_sum + r_sum + root.val, l_valid + r_valid, l_nodes + r_nodes + 1

  # ===========================
  # Our goal is valid count
  return helper(root)[1]

複雜度分析

時間複雜度:

O( n ) DFS 拜訪每個節點,每個節點拜訪一次。

空間複雜度:

O( n ) DFS 拜訪每個節點,最深深度為O(n),發生在整棵樹向左歪斜或向右歪斜時。


關鍵知識點

DFS function 傳統上都是回傳一個參數,或者直接return不帶回傳值。
這題的關鍵考點在於,我們需要的各種資訊都隱含在子樹裡,而且不只一個欄位。
接著想到,function其實可以return 多重欄位的回傳值,回傳給parent node 去計算題目所要求的目標值。


Reference:

[1] Python O(n) by DFS - Count Nodes Equal to Average of Subtree - LeetCode

86會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
題目會給我們一顆二元樹的根結點,要求我們找出每一層最大的節點值。
題目會給我們節點總數目n、左子樹的關係陣列、右子樹的關係陣列,要求我們驗證在給定的條件下,能不能構成一顆合法的二元樹。
題目會給我們兩條已經從小到大排序好的串列,要求我們依照從小到大的順序,合併這兩條串列。
題目的輸入會給我們一個串列,要求我們從頭到尾反轉整個串列。 例子: 如果輸入是1 -> 2 -> 3,那麼輸出就是 3 -> 2 -> 1
題目會給定給我們一顆二元樹的根結點, 要求我們輸出上下顛倒的Level-order traversal的拜訪結果。
題目會給我們一顆二元樹的根節點, 要求我們對齊根節點正中央的虛擬分割線,反轉整顆二元樹。
題目會給我們一顆二元樹的根結點,要求我們找出每一層最大的節點值。
題目會給我們節點總數目n、左子樹的關係陣列、右子樹的關係陣列,要求我們驗證在給定的條件下,能不能構成一顆合法的二元樹。
題目會給我們兩條已經從小到大排序好的串列,要求我們依照從小到大的順序,合併這兩條串列。
題目的輸入會給我們一個串列,要求我們從頭到尾反轉整個串列。 例子: 如果輸入是1 -> 2 -> 3,那麼輸出就是 3 -> 2 -> 1
題目會給定給我們一顆二元樹的根結點, 要求我們輸出上下顛倒的Level-order traversal的拜訪結果。
題目會給我們一顆二元樹的根節點, 要求我們對齊根節點正中央的虛擬分割線,反轉整顆二元樹。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
題目敘述 Combination Sum II_Leetcode #40 給定一個整數陣列candidates 和 目標值target。 每個陣列元素只能選擇一次,請問有多少種組合方法,可以使得組合數總和 = target? 請把滿足組合數總和 = target的組合方法以陣列的形式返回答案
Thumbnail
這篇文章,會帶大家快速回顧DFS+回溯法框架(還沒看過或想複習的可以點連結進去)。 用DFS+回溯法框架,解開 組合數之和 Combination Sum 的全系列題目。 幫助讀者鞏固DFS+回溯法框架這個重要的知識點。 回顧 DFS+回溯法框架 白話的意思 # 列舉所以可能的情況,
Thumbnail
題目敘述 題目會給定一個字串陣列arr最為輸入,我們可以任意選擇一組不包含重複字元的陣列子序列,將字串進行串接,成為字串s,請問字串s的最大長度是多少? 例如: arr=["dog","cow","cat"] 我們可以選擇"dog", "cat"進行串接,得到的字串s="dogcat",s的
Thumbnail
題目敘述 題目會給定我們一顆二元搜索樹的根結點root,和任意兩個樹中的節點p和q。 要求我們找出p, q最靠近的公共祖先節點。 題目的原文敘述 測試範例 Example 1: Input: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q
Thumbnail
題目會給我們一個pair陣列,裡面都是原本陣列相鄰元素形成的pair,順序已經被打散。 要求我們從pair陣列重建出原本的陣列。 答案可能有不只一組,任選一組回傳即可。
Thumbnail
Android 應用程式開發的50 個提示 Android程式碼審查與優化: 程式碼審查建議:“建議對此程式碼片段進行改進:[此處的程式碼片段]。” 性能優化:“建議優化此程式碼性能的方法:[此處的程式碼片段]。” 程式碼重構建議:“推薦重構此程式碼的最佳實踐:[此處的程式碼片段]。”
昨天進行一個小考,來檢視學生學習的成效如何。發現,應用問題有「亂寫」狀況。「亂寫」,只是表示學生寫錯,不是計算錯誤那種類型,而是被除數跟除數搞錯。 心想著,除了重新檢討這個數學問題的意思之外,還有什麼是老師可以做的,來幫助學生更能理解數學。晚上睡前,就胡思亂想了起來。
Thumbnail
隨著健康和健身意識的抬頭,健身追蹤器成為現代人日常生活中的重要裝備。這些健身設備和應用程式提供了豐富的健身數據和資訊,使得健身愛好者能夠更好地掌握自己的健康狀態和運動進程。然而,隨著競爭的日益激烈,健身追蹤器的製造商和開發者也面臨著提高可見性的挑戰。
Thumbnail
在ChatGPT橫空出世的當下😮,如何提一個好問題或是下一個好指令,成為人們的新技能🎯,但是身為老師的您,真的會問好問題嗎🤔?還有良好的提問技巧您掌握住了嗎🎓? 在課堂上,問題提問是一個重要的環節,有助於引導學生思考和參與🌟。 以下是一些常用的提問公式,以及在課堂上的應用和範例📚。
Thumbnail
雖然純詞性類已經淡出了會考選擇題的出題舞台,但在我的系統裡,詞性卻是重要的「解題武器」之一;這個武器的優勢是,他不是用事先背起來的、而是可以現場判斷,只要多加練習,有些題目「不用知道答案,也可以得分」。
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
題目敘述 Combination Sum II_Leetcode #40 給定一個整數陣列candidates 和 目標值target。 每個陣列元素只能選擇一次,請問有多少種組合方法,可以使得組合數總和 = target? 請把滿足組合數總和 = target的組合方法以陣列的形式返回答案
Thumbnail
這篇文章,會帶大家快速回顧DFS+回溯法框架(還沒看過或想複習的可以點連結進去)。 用DFS+回溯法框架,解開 組合數之和 Combination Sum 的全系列題目。 幫助讀者鞏固DFS+回溯法框架這個重要的知識點。 回顧 DFS+回溯法框架 白話的意思 # 列舉所以可能的情況,
Thumbnail
題目敘述 題目會給定一個字串陣列arr最為輸入,我們可以任意選擇一組不包含重複字元的陣列子序列,將字串進行串接,成為字串s,請問字串s的最大長度是多少? 例如: arr=["dog","cow","cat"] 我們可以選擇"dog", "cat"進行串接,得到的字串s="dogcat",s的
Thumbnail
題目敘述 題目會給定我們一顆二元搜索樹的根結點root,和任意兩個樹中的節點p和q。 要求我們找出p, q最靠近的公共祖先節點。 題目的原文敘述 測試範例 Example 1: Input: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q
Thumbnail
題目會給我們一個pair陣列,裡面都是原本陣列相鄰元素形成的pair,順序已經被打散。 要求我們從pair陣列重建出原本的陣列。 答案可能有不只一組,任選一組回傳即可。
Thumbnail
Android 應用程式開發的50 個提示 Android程式碼審查與優化: 程式碼審查建議:“建議對此程式碼片段進行改進:[此處的程式碼片段]。” 性能優化:“建議優化此程式碼性能的方法:[此處的程式碼片段]。” 程式碼重構建議:“推薦重構此程式碼的最佳實踐:[此處的程式碼片段]。”
昨天進行一個小考,來檢視學生學習的成效如何。發現,應用問題有「亂寫」狀況。「亂寫」,只是表示學生寫錯,不是計算錯誤那種類型,而是被除數跟除數搞錯。 心想著,除了重新檢討這個數學問題的意思之外,還有什麼是老師可以做的,來幫助學生更能理解數學。晚上睡前,就胡思亂想了起來。
Thumbnail
隨著健康和健身意識的抬頭,健身追蹤器成為現代人日常生活中的重要裝備。這些健身設備和應用程式提供了豐富的健身數據和資訊,使得健身愛好者能夠更好地掌握自己的健康狀態和運動進程。然而,隨著競爭的日益激烈,健身追蹤器的製造商和開發者也面臨著提高可見性的挑戰。
Thumbnail
在ChatGPT橫空出世的當下😮,如何提一個好問題或是下一個好指令,成為人們的新技能🎯,但是身為老師的您,真的會問好問題嗎🤔?還有良好的提問技巧您掌握住了嗎🎓? 在課堂上,問題提問是一個重要的環節,有助於引導學生思考和參與🌟。 以下是一些常用的提問公式,以及在課堂上的應用和範例📚。
Thumbnail
雖然純詞性類已經淡出了會考選擇題的出題舞台,但在我的系統裡,詞性卻是重要的「解題武器」之一;這個武器的優勢是,他不是用事先背起來的、而是可以現場判斷,只要多加練習,有些題目「不用知道答案,也可以得分」。