0%

1026.节点与其祖先之间的最大差值

1026.节点与其祖先之间的最大差值

题目描述:

给出一个二叉树根节点,找出不同的节点 $A$ 和 $B$ 之间的最大值 $V$ ,其中 $V = |A.val-B.val|$ ,且 $A$ 是 $B$ 的祖先。

数据范围:
$2\le N \le 5000;0\le node.val \le 10^5$

题解:

很明显需要使用树形dp,使用树形dp维护子树节点权重的最大值和最小值,然后用当前节点分别减去最大值最小值取绝对值更新答案。

需要注意的是如果是一个空节点,需要返回临界值,处理当前节点时要注意临界值处理。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
auto optimize_cpp_stdio = []()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
return 0;
}();
class Solution
{
public:
const static int INF = 1e5 + 1;
struct Node
{
int minx, maxx;
};
int ans = 0;
Node dfs(TreeNode *u)
{
if (u == nullptr)
{
return {INF, -1};
}
Node left = dfs(u->left);
Node right = dfs(u->right);
Node tmp = {min(left.minx, right.minx), max(left.maxx, right.maxx)};
if (tmp.minx != INF)
ans = max(ans, abs(u->val - tmp.minx));
if (tmp.maxx != -1)
ans = max(ans, abs(u->val - tmp.maxx));
// ans = max(ans, max(abs(u->val - tmp.minx), abs(u->val - tmp.maxx)))
tmp.minx = min(tmp.minx, u->val);
tmp.maxx = max(tmp.maxx, u->val);
return tmp;
}
int maxAncestorDiff(TreeNode *root)
{
dfs(root);
return ans;
}
};