max_diff_node_ancestor.c (1488B)
| // 1026. Maximum Difference Between Node and Ancestor
#include "leetcode.h"
/*
* 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 ancesotr of 'b'. a node 'a' is an ancesotr of 'b' if either any child if
* 'a' is equal to 'b' or any child 'a' is an ancestor of 'b'.
*/
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
int helper(struct TreeNode *node, int min_seen, int max_seen) {
int leftdiff, rightdiff;
if (!(node->val < min_seen || node->val > max_seen))
;
else {
if (node->val > max_seen)
max_seen = node->val;
else
min_seen = node->val;
}
int diff = max_seen - min_seen;
if (node->left == NULL && node->right == NULL)
return diff;
else if (!(node->left != NULL && node->right != NULL)) {
if (node->left == NULL) {
leftdiff = 0;
rightdiff = helper(node->right, min_seen, max_seen);
return (rightdiff > diff ? rightdiff : diff);
} else {
rightdiff = 0;
leftdiff = helper(node->left, min_seen, max_seen);
return (leftdiff > diff ? leftdiff : diff);
}
} else {
leftdiff = helper(node->left, min_seen, max_seen);
rightdiff = helper(node->right, min_seen, max_seen);
return leftdiff > rightdiff ? leftdiff : rightdiff;
}
}
int maxAncestorDiff(struct TreeNode *root) {
return !root ? 0 : helper(root, root->val, root->val);
}
|