Maximum Difference Between Node and Ancestor
Problem Statementβ
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: A is an ancestor of B or if the given B is an ancestor of A.
**Example TreeNode root =
Example
Here's an example solution for LeetCode problem 1026, "Maximum Difference Between Node and Ancestor":
Problem Statementβ
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 there exists a path from A to B (including A and B themselves).
Exampleβ
For example, consider the following binary tree:
8
/ \
3 10
/ \ \
1 6 14
/ \ /
4 7 13
The maximum difference between a node and its ancestor in this tree is 7
, which occurs between node 1
and node 8
(or node 10
).
Solutionsβ
Approach: Depth-First Search (DFS)β
To solve this problem, we can use a depth-first search (DFS) approach to track the minimum and maximum values encountered on the path from the root to each node. Here's how the solution can be implemented in Java, Python, and C++:
Javaβ
class Solution {
int maxDifference = 0;
public int maxAncestorDiff(TreeNode root) {
dfs(root, root.val, root.val);
return maxDifference;
}
private void dfs(TreeNode node, int minAncestor, int maxAncestor) {
if (node == null) return;
int currentDiff = Math.max(Math.abs(node.val - minAncestor), Math.abs(node.val - maxAncestor));
maxDifference = Math.max(maxDifference, currentDiff);
minAncestor = Math.min(minAncestor, node.val);
maxAncestor = Math.max(maxAncestor, node.val);
dfs(node.left, minAncestor, maxAncestor);
dfs(node.right, minAncestor, maxAncestor);
}
}
Pythonβ
class Solution:
def maxAncestorDiff(self, root: TreeNode) -> int:
self.max_diff = 0
def dfs(node, min_ancestor, max_ancestor):
if not node:
return
current_diff = max(abs(node.val - min_ancestor), abs(node.val - max_ancestor))
self.max_diff = max(self.max_diff, current_diff)
min_ancestor = min(min_ancestor, node.val)
max_ancestor = max(max_ancestor, node.val)
dfs(node.left, min_ancestor, max_ancestor)
dfs(node.right, min_ancestor, max_ancestor)
dfs(root, root.val, root.val)
return self.max_diff
C++β
class Solution {
public:
int maxDifference = 0;
int maxAncestorDiff(TreeNode* root) {
dfs(root, root->val, root->val);
return maxDifference;
}
void dfs(TreeNode* node, int minAncestor, int maxAncestor) {
if (!node) return;
int currentDiff = max(abs(node->val - minAncestor), abs(node->val - maxAncestor));
maxDifference = max(maxDifference, currentDiff);
minAncestor = min(minAncestor, node->val);
maxAncestor = max(maxAncestor, node->val);
dfs(node->left, minAncestor, maxAncestor);
dfs(node->right, minAncestor, maxAncestor);
}
};