Powered by:NEFU AB-IN
Link
1373. 二叉搜索子树的最大键值和
-
题意
给你一棵以 root 为根的 二叉树 ,请你返回 任意 二叉搜索子树的最大键值和。
-
思路 判断一颗树是否是二叉搜索树的充分条件:
- 根节点值大于左子树最大值,说明比左子树所有元素都大
- 根节点值小于右子树最小值,说明比右子树所有元素都小
- 左子树是二叉搜索树
- 右子树是二叉搜索树
满足上面四个条件,我们就推断出当前树是一颗二叉搜索树。 所以我们可以在每层递归里记录四个值:
- 当前树的最小值
- 当前树的最大值
- 当前树的和
- 当前树是否是二叉搜索树
当前调用层的每个值都可以根据它的左子树和右子树返回的数组,以及它本身的值来更新。 -
代码
class Solution {
public:
int ans = 0;
vector<int> dfs(TreeNode* root){
if(!root) return {INT_MAX, INT_MIN, 0, true};
auto left = dfs(root->left);
auto right = dfs(root->right);
int val = root->val;
int sum = left[2] + right[2] + val;
bool isB = false;
if(val > left[1] && val < right[0]){
if(left[3] && right[3]) isB = true;
}
if(isB) ans = max(ans, sum);
int mx = max({left[1], right[1], val});
int mn = min({left[0], right[0], val});
return {mn, mx, sum, isB};
}
int maxSumBST(TreeNode* root) {
dfs(root);
return ans;
}
};
|