333. Largest BST Subtree

来源:互联网 发布:select2 js默认选中空 编辑:程序博客网 时间:2024/05/09 07:23

这道题是 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);    }};



在Valid BST (http://blog.csdn.net/revoir/article/details/51719690) 的文章中提到了返回值的方法。返回值方法虽然对于Valid BST并不是最优解,但却是一类Tree问题的通解。框架不变只要改动返回的datadum,就可以触类旁通到各类问题。这道题就是其中一个。

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都过了。。。



0 0
原创粉丝点击