###### tags: `leetcode` `medium` `Tree` `Depth-First Search` `Binary Tree` # [1026. Maximum Difference Between Node and Ancestor](https://leetcode.com/problems/maximum-difference-between-node-and-ancestor/description/) ## 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`. ## Examples ### Example1 ![Tmp_Tree](https://assets.leetcode.com/uploads/2020/11/09/tmp-tree.jpg) **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. ### Example2 ![Tmp_Tree1](https://assets.leetcode.com/uploads/2020/11/09/tmp-tree-1.jpg) **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 \leq Node.val \leq 10^5$ ## Code ```c= /** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */ typedef struct TreeNode TNODE; int postOrder(TNODE *root, int max, int min){ if(!root) return max-min; max = (root->val > max) ? root->val : max; min = (root->val < min) ? root->val : min; int left = postOrder(root->left, max, min); int right = postOrder(root->right, max, min); return left>right ? left : right; } int maxAncestorDiff(struct TreeNode* root){ if(!root) return 0; return postOrder(root, root->val, root->val); } ``` ## Complexity |Space |Time | |- |- | |$O(N)$|$O(N)$| ## Result - Runtime : 0 ms, 100% - Memory : 7.5 MB, 54.55% ## Notes - Each difference is founded by the maximum and minimum of the path. - Since each branch has the same subset notes of their parent, they inherit their parent's maximum and minimum and continue to update. - We can not using call by address, because we need to maintain previous( parents' ) max/min for next branch counting. - We use DFS( post-order traversal ) to scan whole tree, update max/min as we found `NULL` pointer. After then we just update the difference of current branch to parent and ancestors and they will compare their branches and return maximum difference.