1026. Maximum Difference Between Node and Ancestor

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

Rust Solution

struct Solution;
use rustgym_util::*;

trait Preorder {
    fn preorder(&self, parent: Option<(i32, i32)>, abs: &mut i32);
}

impl Preorder for TreeLink {
    fn preorder(&self, mut parent: Option<(i32, i32)>, abs: &mut i32) {
        if let Some(node) = self {
            let val = node.borrow().val;
            let left = &node.borrow().left;
            let right = &node.borrow().right;
            parent = if let Some((min, max)) = parent {
                *abs = (*abs).max((min - val).abs().max((max - val).abs()));
                Some((min.min(val), max.max(val)))
            } else {
                Some((val, val))
            };
            left.preorder(parent, abs);
            right.preorder(parent, abs);
        }
    }
}

impl Solution {
    fn max_ancestor_diff(root: TreeLink) -> i32 {
        let mut res = 0;
        root.preorder(None, &mut res);
        res
    }
}

#[test]
fn test() {
    let root = tree!(
        8,
        tree!(3, tree!(1), tree!(6, tree!(4), tree!(7))),
        tree!(10, None, tree!(14, tree!(13), None))
    );
    let res = 7;
    assert_eq!(Solution::max_ancestor_diff(root), res);
}

Having problems with this solution? Click here to submit an issue on github.