333. Largest BST Subtree

这道题是 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值