1.要判断该子树是否是二叉搜索树,需要四个条件:1.左子树是否是二叉搜索树
2.右子树是否是二叉搜索树。
3.根节点的值是否大于左子树最大值
4.根节点的值是否小于右子树的最小值。
2.所以选择一个数组来存储这四个量,方便判断该子树是否是二叉搜索树。
注意:一旦某个子树不是二叉搜索树,那就代表包含该子树的树一定不是二叉搜索树。
利用递归来完成。
/**
* 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 ans=0;
int maxSumBST(TreeNode* root) {
dfs(root);
return ans;
}
vector<int> dfs(TreeNode* root){
if(!root) return{true,INT_MAX,INT_MIN,0};
auto rt=dfs(root->right);
auto lt=dfs(root->left);
if(!rt[0]||!lt[0]||root->val>=rt[1]||root->val<=lt[2]){
return {false,0,0,0};
}
int sum=0,curmax,curmin;
curmax=root->right?rt[2]:root->val;
curmin=root->left?lt[1]:root->val;
sum=root->val+rt[3]+lt[3];
ans=max(ans,sum);
return{true,curmin,curmax,sum};
}
};