LeetCode 1026. Maximum Difference Between Node and Ancestor Solution in Java, C++, Python & More | Explanation + Code

CoderIndeed
0
1026. Maximum Difference Between Node and Ancestor

Description

Given the root of a binary tree, find the maximum value v for which there exist different nodes a and b where v = |a.val - b.val| and a is an ancestor of b.

A node a is an ancestor of b if either: any child of a is equal to b or any child of a is an ancestor of b.

 

Example 1:

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:

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 <= 105

Solutions

Solution 1: DFS

For each node, to find the maximum difference with its ancestor nodes, we only need to find the difference between the maximum and minimum values of the ancestor nodes. The maximum difference among all nodes and their ancestor nodes is the answer.

Therefore, we design a function dfs(root, mi, mx), where the current node being searched is root, the maximum value of its ancestor nodes is mx, and the minimum value is mi. The function updates the maximum difference ans.

The logic of the function dfs(root, mi, mx) is as follows:

  • If root is null, return directly.
  • Otherwise, we update ans = max(ans, |mi - root.val|, |mx - root.val|).
  • Then update mi = min(mi, root.val), mx = max(mx, root.val), and recursively search the left and right subtrees.

In the main function, we call dfs(root, root.val, root.val), and finally return ans.

The time complexity is O(n), and the space complexity is O(n). Where n is the number of nodes in the binary tree.

PythonJavaC++GoTypeScriptJavaScriptC#
# 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: def dfs(root: Optional[TreeNode], mi: int, mx: int): if root is None: return nonlocal ans ans = max(ans, abs(mi - root.val), abs(mx - root.val)) mi = min(mi, root.val) mx = max(mx, root.val) dfs(root.left, mi, mx) dfs(root.right, mi, mx) ans = 0 dfs(root, root.val, root.val) return ans(code-box)

Post a Comment

0Comments

Post a Comment (0)

#buttons=(Accept !) #days=(20)

Our website uses cookies to enhance your experience. Check Now
Accept !