[Locked] Largest BST Subtree

Largest BST Subtree

Given a binary tree, find the largest subtree which is a Binary Search Tree (BST), where largest means subtree with largest number of nodes in it.

Note:
A subtree must include all of its descendants.
Here's an example:

    10
    / \
   5  15
  / \   \ 
 1   8   7

The Largest BST Subtree in this case is the highlighted one. 
The return value is the subtree's size, which is 3.

    Follow up:
    Can you figure out ways to solve it with O(n) time complexity?

    分析:

      典型树上的动态规划

    代码:

    //返回pair中4个值分别代表:是否是BST,BST的节点数,左边界,右边界
    pair<pair<bool, int>, pair<int, int>> dfs(TreeNode *cur, int pval, int &maxl) {
        pair<int, int> initp(pval, pval);
        //为NULL,则返回真,两端值设为父节点的值便于下一步计算
        if(!cur)
            return make_pair(make_pair(true, 0), initp);
        //进行下一层遍历
        pair<pair<bool, int>, pair<int, int>> leftp, rightp;
        leftp = dfs(cur->left, cur->val, maxl);
        rightp = dfs(cur->right, cur->val, maxl);
        //判断是否为BST
        if(leftp.first.first && rightp.first.first && cur->val >= leftp.second.second && cur->val <= rightp.second.first) {
            int curlen = leftp.first.second + 1 + rightp.first.second;
            maxl = max(maxl, curlen);
            return make_pair(make_pair(true, curlen), make_pair(leftp.second.first, rightp.second.second));
        }
        return make_pair(make_pair(false, 0), initp);
    }
    int largestSubtree(TreeNode *root) {
        int maxl = INT_MIN;
        dfs(root, 0, maxl);
        return maxl;
    }

     

    posted @ 2016-02-27 22:23  CarlGoodman  阅读(170)  评论(0编辑  收藏  举报