Medium
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:
[2, 5000]
.0 <= Node.val <= 105
import com_github_leetcode.TreeNode
import kotlin.math.abs
/*
* Example:
* var ti = TreeNode(5)
* var v = ti.`val`
* Definition for a binary tree node.
* class TreeNode(var `val`: Int) {
* var left: TreeNode? = null
* var right: TreeNode? = null
* }
*/
class Solution {
private var max = 0
fun maxAncestorDiff(root: TreeNode?): Int {
traverse(root, -1, -1)
return max
}
private fun traverse(root: TreeNode?, maxAncestor: Int, minAncestor: Int) {
if (root == null) {
return
}
if (maxAncestor == -1) {
traverse(root.left, root.`val`, root.`val`)
traverse(root.right, root.`val`, root.`val`)
}
if (maxAncestor != -1) {
max = max.coerceAtLeast(abs(maxAncestor - root.`val`))
max = max.coerceAtLeast(abs(minAncestor - root.`val`))
traverse(root.left, root.`val`.coerceAtLeast(maxAncestor), root.`val`.coerceAtMost(minAncestor))
traverse(root.right, root.`val`.coerceAtLeast(maxAncestor), root.`val`.coerceAtMost(minAncestor))
}
}
}