1026. Maximum Difference Between Node and Ancestor

1026. Maximum Difference Between Node and Ancestor

這題要找的是 「某個節點與它的祖先節點之間的差異最大值」。節點的選擇可以是樹中的任何一點,可以不是原始的根節點,這也是這個題目最困難的地方。

換句話說,這個題目的暴力解法可以是我先從根節點開始,往每個子節點探索,找出最大的差異,之後再從另外的一個新的節點出發,重新遍歷一次所有的節點。

這樣的暴力法有著非常多的重複,也非常沒有效率。如果要更有效率的解決這個問題,需要再觀察此題目。

這個題目有一個限制,是要找出的兩個點,其中一個一定要是從祖先來的,不能是旁邊不同的樹的子節點。所以如果我在某個節點上,可以知道所有祖先節點的值,我就能夠找出最大值了。但是如果更仔細的再想一下這個條件,其實我說不定不用所有祖先節的的值,我只要可以記錄到祖先節點的最大值以及最小值就好。

為什麼呢?因為題目是要求極值,在當前節點上,能夠產生出極值的情況,一定只有最大值跟最小值,會同時取最大跟最小則是因為我們需要的是絕對值。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def maxAncestorDiff(self, root: Optional[TreeNode]) -> int:

        self.result = 0

        def dfs(node, minVal, maxVal):
            if not node:
                return
            dfs(node.left, min(minVal, node.val), max(maxVal, node.val))
            dfs(node.right, min(minVal, node.val), max(maxVal, node.val))
            self.result = max(self.result, abs(maxVal - node.val), abs(minVal - node.val))
            
        dfs(root, root.val, root.val)

        return self.result