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:
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */funcmaxAncestorDiff(root*TreeNode)(ansint){vardfsfunc(*TreeNode,int,int)dfs=func(root*TreeNode,mi,mxint){ifroot==nil{return}ans=max(ans,max(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)}dfs(root,root.Val,root.Val)return}funcabs(xint)int{ifx<0{return-x}returnx}