这道题是 98. Validate Binary Search Tree 的进阶。最好先想到的方法就是对于每一个subtree判断他是不是valid BST,如果是的话计算size。
这样的解法问题就在于,时间复杂度太高了。
class Solution_largest_BST_simple{
public:
int largest (TreeNode* root){
if(isBST(root))
return 1+size(root->left)+size(root->right);
else
return max(largest(root->left), largest(root->right));
}
int size(TreeNode* root){
if(root==nullptr)
return 0;
return size(root->left)+size(root->right)+1;
}
bool isBST(TreeNode* root){
return helper_valid(root, INT_MIN, INT_MAX);
}
bool helper_valid(TreeNode* root, int left_max, int right_min){
if(root==nullptr) return true;
if(root->val>=right_min || root->val<=left_max)
return false;
return helper_valid(root->left, left_max, root->val)
&& helper_valid(root->right, root->val, right_min);
}
};
class data_dump{
public:
int min_val;
int max_val;
bool is_valid;
int size;
data_dump(){
min_val=INT_MIN;
max_val=INT_MAX;
is_valid=true;
size=0;
};
};
class Solution_largest_BST{
public:
int largest_bst(TreeNode* root){
data_dump res;
res = helper_large_bst(root);
return res.size;
}
data_dump helper_large_bst(TreeNode* root){
data_dump res;
if(root==nullptr){
return res;
}
data_dump left_res = helper_large_bst(root->left);
data_dump right_res = helper_large_bst(root->right);
if(left_res.is_valid&&right_res.is_valid&&
root->val>left_res.max_val&&root->val<right_res.min_val){
res.size=left_res.size+right_res.size+1;
res.min_val=left_res.min_val;
res.max_val=right_res.max_val;
}
else{
res.is_valid=false;
res.size=max(left_res.size, right_res.size);
}
return res;
}
};
因为我没有买lc的会员,所以并不知道上段代码能不能ac。不过我自己跑的几个test case都过了。。。