expertfunda logo Top Interview Questions Binary Tree Binary Search Tree Graph

Maximum Difference Between Node and Ancestor

Maximum Difference Between Node and Ancestor Leetcode 1026. Maximum Difference Between Node and Ancestor

Maximum Difference Between Node and Ancestor

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.

Approach 1: Recursive solution


class Solution {
    int result = 0;

    public int maxAncestorDiff(TreeNode root) {
        if (root == null)
            return 0; // base case

        result = 0;
        helper(root, root.val, root.val);
        return result;
    }

    void helper(TreeNode node, int currMax, int currMin) {
        if (node == null)
            return; // base case

        // update 'result'
        int possibleResult = Math.max(Math.abs(currMax - node.val), Math.abs(currMin - node.val));
        result = Math.max(result, possibleResult);

        // update max and min
        currMax = Math.max(currMax, node.val);
        currMin = Math.min(currMin, node.val);

        helper(node.left, currMax, currMin);
        helper(node.right, currMax, currMin);
        return;
    }
}
                

Time Complexity: O(n) and Space Complexity: O(n)


Approach 2: DFS Recursive


class Solution {

    public int maxAncestorDiff(TreeNode root) {
        if (root == null)
            return 0; // base case

        return helper(root, root.val, root.val);
    }

    int helper(TreeNode node, int currMax, int currMin) {
        if (node == null)
            return currMax - currMin;

        // update max and min
        currMax = Math.max(currMax, node.val);
        currMin = Math.min(currMin, node.val);

        int left = helper(node.left, currMax, currMin);
        int right = helper(node.right, currMax, currMin);

        return Math.max(left, right);
    }
}
                

Time Complexity: O(n) and Space Complexity: O(n)


Maximum Difference Between Node and Ancestor

The problem Maximum Difference Between Node and Ancestor is a fascinating binary tree challenge. It requires finding the maximum difference between the value of a node and the value of one of its ancestors in a given binary tree.

Problem Statement

Given the root of a binary tree, return the maximum difference between the value of any node and the value of any ancestor of that node. An "ancestor" of a node is any node on the path from the root to that node (excluding the node itself).

Approach to Solve the Problem

To solve this problem, we use a recursive depth-first search (DFS) approach. During the traversal, we maintain the minimum and maximum values encountered from the root to the current node. At each step, we calculate the potential differences and update the global maximum difference.

Steps to Solve:

  1. Perform a DFS traversal of the binary tree.
  2. Pass the current minimum and maximum values from the root to the current node.
  3. At each node, compute the differences between the node value and the current min/max values.
  4. Update the global maximum difference based on the computed values.
  5. Recursively traverse the left and right subtrees with updated min/max values.

Implementation

Here is the Python implementation:


class Solution:
    def maxAncestorDiff(self, root):
        def dfs(node, cur_min, cur_max):
            if not node:
                return cur_max - cur_min
            cur_min = min(cur_min, node.val)
            cur_max = max(cur_max, node.val)
            left_diff = dfs(node.left, cur_min, cur_max)
            right_diff = dfs(node.right, cur_min, cur_max)
            return max(left_diff, right_diff)
        
        return dfs(root, root.val, root.val)
        

Here is a Java implementation:


class Solution {
    public int maxAncestorDiff(TreeNode root) {
        return dfs(root, root.val, root.val);
    }

    private int dfs(TreeNode node, int curMin, int curMax) {
        if (node == null) {
            return curMax - curMin;
        }
        curMin = Math.min(curMin, node.val);
        curMax = Math.max(curMax, node.val);
        int leftDiff = dfs(node.left, curMin, curMax);
        int rightDiff = dfs(node.right, curMin, curMax);
        return Math.max(leftDiff, rightDiff);
    }
}
        

Example

Consider the binary tree:

            Tree Structure:
                8
               / \
              3   10
             / \     \
            1   6     14
               / \    /
              4   7  13
        

The maximum difference between a node and an ancestor is 7, which occurs between node 1 and its ancestor 8.

Complexity Analysis

Time Complexity: O(n), where n is the number of nodes in the tree. Each node is visited once.

Space Complexity: O(h), where h is the height of the tree. This accounts for the recursive call stack.

Applications

  • Helps in hierarchical data analysis where relationships between nodes matter.
  • Used in applications requiring comparison of attributes between parent and child entities.
  • Analyzes variability in genealogical trees or similar structures.

Conclusion

The problem Maximum Difference Between Node and Ancestor is a great example of applying DFS traversal with parameter passing. By leveraging recursion, we efficiently calculate the maximum difference while exploring the binary tree.

Practice this problem to strengthen your skills in binary tree algorithms and recursive problem-solving.