Description:
Given the root of a binary tree, find the maximum value V for which there exists 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: [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.
Note:
- The number of nodes in the tree is between 2 and 5000.
- Each node will have value between 0 and 100000.
Analysis:
- Define an object variable
maxDiff
to denote the solution to the problem. - Define a function
findMaxDiff(TreeNode node, int max, int min)
to find the max value ofmaxDiff
as well as do the pre-order traversal of this tree. Herenode
represents the current node,max
andmin
represent the max value and min value of the ancestors ofnode
respecticely. - In each execution of
findMaxDiff
function:
① Update themax
,min
,maxDiff
.
② Recall nextfindMaxDiff
function.
Code:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
private int maxDiff;
public int maxAncestorDiff(TreeNode root) {
if(root == null) {
return maxDiff;
}else{
findMaxDiff(root, root.val, root.val);
return maxDiff;
}
}
public void findMaxDiff(TreeNode node, int max, int min) {
if(node == null) {
return;
}else{
if(node.val > max) {
max = node.val;
}
if(node.val < min) {
min = node.val;
}
int diff = max - min;
if(diff > maxDiff) {
maxDiff = diff;
}
if(node.left != null) {
findMaxDiff(node.left, max, min);
}
if(node.right != null) {
findMaxDiff(node.right, max, min);
}
}
}
}