圖論應用題 祖孫節點的最大差值絕對值 Max Diff Between Nodes_Leetcode #1026

更新於 發佈於 閱讀時間約 3 分鐘

題目敘述

題目會給定我們一棵二元數Binary Tree的根結點。

問我們任意祖先節點和晚輩節點之間,最大差值的絕對值是多少?

題目的原文敘述


測試範例

Example 1:

raw-image
Input: root = [8,3,10,1,6,null,14,null,null,4,7,13]
Output: 7
Explanation: We have various ancestor-node differences, some of which are given below :
|8 - 3| = 5
|3 - 7| = 4
|8 - 1| = 7
|10 - 13| = 3
Among all possible differences, the maximum value of 7 is obtained by |8 - 1| = 7.

Example 2:

raw-image
Input: root = [1,null,2,null,0,3]
Output: 3

約束條件

Constraints:

  • The number of nodes in the tree is in the range [2, 5000].
  • 0 <= Node.val <= 10^5

演算法

因為題目給定的是根結點,所以拜訪順序一定是從上往下走

這題的關鍵在於如何從上層傳遞資訊給下層的子節點

題目要求的是任意祖先和晚輩節點之間的最大差值的絕對值,最大差值一定發生在最大值和最小值相減的時候。

因此,我們可以在DFS function中除了放node節點資訊之外,多攜帶兩個參數,分別是lowhigh代表目前這條路徑所遇到的最小值最大值,每一次往下遞迴的時候,都攜帶並且更新最小值和最大值。

最後,讓所有探索路徑的最大值-最小值=差值,再取max取得最大的差值,就是最終的答案。


程式碼

class Solution:
def maxAncestorDiff(self, root: TreeNode) -> int:

def update(node, low, high):

if not node:
return high - low

high = max(high, node.val)
low = min(low, node.val)

return max( update(node.left, low, high), update(node.right, low, high) )

# ------------------------
return update(root, root.val, root.val)

複雜度分析

時間複雜度:

DFS拜訪整張圖,每個節點至多拜訪一次, O(n)。

空間複雜度:

O(n) DFS拜訪整張圖,最大深度發生在整棵樹向左歪斜或者向右歪斜時 = O(n)。


關鍵知識點

這題的關鍵在於如何從上層傳遞資訊給下層的子節點

題目要求的是任意祖先和晚輩節點之間的最大差值的絕對值,最大差值一定發生在最大值和最小值相減的時候。


Reference:

[1] Maximum Difference Between Node and Ancestor - LeetCode

avatar-img
91會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目敘述 題目會給定我們一棵二元數Binary Tree的根結點。 並且給定感染的病毒源節點位置,每個單位時間,可以向相鄰的節點感染一次,問我們需要多少時間去感染整棵樹? 題目的原文敘述 測試範例 Example 1: Input: root = [1,5,3,null,4,10,6,
題目敘述 題目會給我們一個輸入陣列prerequisites,每個pair代表兩個課程之間的先修關係,和課程總數numCourses。 題目問我們這組課程表是否能依照順序修完所有的課程? 如果可以,返回True。 如果不行,代表有擋修形成死結,無法依照順序修完所有的課程,返回False。
題目敘述 題目會給定我們一顆二元搜索樹的根結點root,和任意兩個樹中的節點p和q。 要求我們找出p, q最靠近的公共祖先節點。 題目的原文敘述 測試範例 Example 1: Input: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q
題目敘述 題目會給我們一個不規則排列的二維陣列,要求我們列出從起點出發,走次對角線,由左下到右上逐層拜訪的路徑。
題目會給我們一個routes 陣列,裡面都是分別代表每一條公車路線所對應的公車站編號。 題目要求我們計算出,從起點站source到終點站target的最精簡公車路線搭乘次數是幾次? 也就是說,就是在最少轉乘的前提下,旅途中需要搭乘幾條公車路線?
題目會給我們一個pair陣列,裡面都是原本陣列相鄰元素形成的pair,順序已經被打散。 要求我們從pair陣列重建出原本的陣列。 答案可能有不只一組,任選一組回傳即可。
題目敘述 題目會給定我們一棵二元數Binary Tree的根結點。 並且給定感染的病毒源節點位置,每個單位時間,可以向相鄰的節點感染一次,問我們需要多少時間去感染整棵樹? 題目的原文敘述 測試範例 Example 1: Input: root = [1,5,3,null,4,10,6,
題目敘述 題目會給我們一個輸入陣列prerequisites,每個pair代表兩個課程之間的先修關係,和課程總數numCourses。 題目問我們這組課程表是否能依照順序修完所有的課程? 如果可以,返回True。 如果不行,代表有擋修形成死結,無法依照順序修完所有的課程,返回False。
題目敘述 題目會給定我們一顆二元搜索樹的根結點root,和任意兩個樹中的節點p和q。 要求我們找出p, q最靠近的公共祖先節點。 題目的原文敘述 測試範例 Example 1: Input: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q
題目敘述 題目會給我們一個不規則排列的二維陣列,要求我們列出從起點出發,走次對角線,由左下到右上逐層拜訪的路徑。
題目會給我們一個routes 陣列,裡面都是分別代表每一條公車路線所對應的公車站編號。 題目要求我們計算出,從起點站source到終點站target的最精簡公車路線搭乘次數是幾次? 也就是說,就是在最少轉乘的前提下,旅途中需要搭乘幾條公車路線?
題目會給我們一個pair陣列,裡面都是原本陣列相鄰元素形成的pair,順序已經被打散。 要求我們從pair陣列重建出原本的陣列。 答案可能有不只一組,任選一組回傳即可。
你可能也想看
Google News 追蹤
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
這篇文章,會帶著大家複習以前學過的BFS框架, 並且以圖論的應用題與概念為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 BFS 框架 + 演算法 虛擬碼 # Queue 通常初始化成根結點,作為起點 BFS_queue = deque([root])​ # 先
Thumbnail
題目敘述 題目會給定一棵二元樹的根結點, 要求我們計算滿足局部路徑節點和=targetSum的數目有多少? 註: 局部路徑節點和 =由節點a往下走到某個節點b,這個區間內的節點值總和 題目的原文敘述 測試範例 Example 1: Input: root = [10,5,-3,3
Thumbnail
題目敘述 題目會給定一顆二元樹的根結點Root node,和指定的目標值targetSum。 問我們能不能從二元樹裡面找到一條從根結點到葉子結點的路徑,其路徑上的節點值總和恰好為targetSum? 可以的話,返回True。 無解的話,返回False。 題目的原文敘述 測試範例 E
Thumbnail
題目敘述 題目會給定兩顆二元樹的根結點,要求我們判斷這兩顆二元樹是否為 葉子相似樹? 葉子相似樹的定義 兩顆二元樹,從左到右看的葉子結點的序列完全相同。 例如下圖中的這兩顆二元樹,從左到右看的葉子結點的序列 = [6, 7, 4, 9, 8] 完全相同。 題目的原文敘述 測試範例
Thumbnail
題目敘述 題目會給定我們一棵二元數Binary Tree的根結點。 問我們任意祖先節點和晚輩節點之間,最大的差值的絕對值是多少? 題目的原文敘述 測試範例 Example 1: Input: root = [8,3,10,1,6,null,14,null,null,4,7,13] Ou
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
這篇文章,會帶著大家複習以前學過的BFS框架, 並且以圖論的應用題與概念為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 BFS 框架 + 演算法 虛擬碼 # Queue 通常初始化成根結點,作為起點 BFS_queue = deque([root])​ # 先
Thumbnail
題目敘述 題目會給定一棵二元樹的根結點, 要求我們計算滿足局部路徑節點和=targetSum的數目有多少? 註: 局部路徑節點和 =由節點a往下走到某個節點b,這個區間內的節點值總和 題目的原文敘述 測試範例 Example 1: Input: root = [10,5,-3,3
Thumbnail
題目敘述 題目會給定一顆二元樹的根結點Root node,和指定的目標值targetSum。 問我們能不能從二元樹裡面找到一條從根結點到葉子結點的路徑,其路徑上的節點值總和恰好為targetSum? 可以的話,返回True。 無解的話,返回False。 題目的原文敘述 測試範例 E
Thumbnail
題目敘述 題目會給定兩顆二元樹的根結點,要求我們判斷這兩顆二元樹是否為 葉子相似樹? 葉子相似樹的定義 兩顆二元樹,從左到右看的葉子結點的序列完全相同。 例如下圖中的這兩顆二元樹,從左到右看的葉子結點的序列 = [6, 7, 4, 9, 8] 完全相同。 題目的原文敘述 測試範例
Thumbnail
題目敘述 題目會給定我們一棵二元數Binary Tree的根結點。 問我們任意祖先節點和晚輩節點之間,最大的差值的絕對值是多少? 題目的原文敘述 測試範例 Example 1: Input: root = [8,3,10,1,6,null,14,null,null,4,7,13] Ou