0%

1373. 二叉搜索子树的最大键值和

1373.二叉搜索子树的最大键值和

题目描述:

给出一棵以 $root$ 为根的二叉树,找出其中最大的二叉搜索树的最大键值和。

数据范围:

$1\le n \le 4\times 10^4$

题解:

二叉搜索树,左子树小于该节点,右子树大于该节点。

使用如下结构记录

1
2
3
4
5
6
7
struct NodeStatus
{
bool isBst;
int maxx;
int minx;
int sum;
};

然后直接后续遍历,如果两个子树都是bst,那么就判断 left.maxx < root->val && root->val < right.minx,如果为真,则该子树是bst,更新信息, $maxx = \max(val, right.max), minx = \min(val, left.min)$

代码:

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
40
41
auto optimize_cpp_stdio = []()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
return 0;
}();
class Solution
{
public:
const int INF = 0x3f3f3f3f;
struct NodeStatus
{
bool isBst;
int maxx;
int minx;
int sum;
};
int ans = 0;
NodeStatus dfs(TreeNode *root)
{
if (root == nullptr)
return {true, -INF, INF, 0};

NodeStatus left = dfs(root->left);
NodeStatus right = dfs(root->right);
if (left.isBst && right.isBst && left.maxx < root->val && root->val < right.minx)
{
int val = left.sum + root->val + right.sum;
ans = max(ans, val);
return {true, max(root->val, right.maxx), min(root->val, left.minx), val};
}
else
return {false, 0, 0, 0};
}
int maxSumBST(TreeNode *root)
{
dfs(root);
return ans;
}
};