Maximum Difference Between Node and Ancestor

MediumTreeDepth-First SearchBinary Tree

Solution

import { TreeNode } from '@algorithm/lib';
 
export function maxAncestorDiff(root: TreeNode | null): number {
  if (root === null) {
    return 0;
  }
 
  function findAncestorDiff(
    node: TreeNode | null,
    maxAncestor: number,
    minAncestor: number,
  ): number {
    if (node === null) {
      return 0;
    }
 
    const maxNextAncestor = Math.max(maxAncestor, node.val);
    const minNextAncestor = Math.min(minAncestor, node.val);
    const maxDiff = Math.max(Math.abs(maxAncestor - node.val), Math.abs(minAncestor - node.val));
    return Math.max(
      maxDiff,
      findAncestorDiff(node.left, maxNextAncestor, minNextAncestor),
      findAncestorDiff(node.right, maxNextAncestor, minNextAncestor),
    );
  }
 
  return findAncestorDiff(root, root.val, root.val);
}