0%

1026. Maximum Difference Between Node and Ancestor

O(n) time O(h) space
每次更新mx和mn,到nullptr时得到根到叶的一条路径上的最大和最小值,只需要求差即可,对于左右两个子树返回上来的不同路径的最大最小值之差,只需要取较大的那个即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int maxAncestorDiff(TreeNode* root) {
return dfs(root, root->val, root->val);
}

int dfs(TreeNode *root, int mx, int mn) { // 输入从根到当前节点之前的最大和最小值
return root ? max(dfs(root->left, max(mx, root->val), min(mn, root->val)), dfs(root->right, max(mx, root->val), min(mn, root->val))) : mx - mn;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int maxAncestorDiff(TreeNode* root) {
return dfs(root, root->val, root->val); // 初始最大最小都为root即可
}

int dfs(TreeNode *root, int mx, int mn) { // 因为是绝对值,所以要维护最大最小两个值
if (!root) return mx - mn;
mx = max(mx, root->val);
mn = min(mn, root->val);
return max(dfs(root->left, mx, mn), dfs(root->right, mx, mn));
}
};