leetcode : Unique Binary Search Trees I&II

Given n, how many structurally unique BST's (binary search trees) that store values 1...n?

For example,
Given n = 3, there are a total of 5 unique BST's.

 I是要求返回不同结构的树的数量,II要求把所有的可能的树构造出来,然后返回他们的根。

I:

对于n,可以分别选择他的第1,2,3,  n个节点作为根节点,同时选取第i个节点时,左子树由0 -  i -1 组成,右子树由i + 1 到n组成。

下面是AC代码:

class Solution {
public:
    int numTrees(int n) {
        vector<int> dp(n + 1,0);
        dp[0] = 1;
        dp[1] = 1;
        for(int i = 2; i <= n; ++i){
            int val = 0;
            for(int j = 1; j <= i; ++j){
                val += dp[j - 1] * dp[i - j];
            }
            dp[i] =val;
        }
        return dp[n];
    }
};

 

II:

II需要建立所有的子树,用深度搜索可以很好的解决问题,可以建立这样一个dfs函数:

它将从start 到 end的数字建立成树,并且返回所有的根节点。之后的思路与1是一样的,即分别选取第1,2,..n个节点为根,分别建立左右子树,由于结构一样但是value不同的树应该看成不同的树,所以在dfs函数中需要加上start与end参数

下面是AC代码:

class Solution {
public:
    vector<TreeNode *> generateTrees(int n) {
        vector<TreeNode *> ret;
        ret = creatTrees(1,n);
        return ret;
    }
    vector<TreeNode *> creatTrees(int start, int end){
        vector<TreeNode *> ret;
        if(start > end){
            ret.push_back(NULL);
            return ret;
        }
        if(start == end){
            ret.push_back(new TreeNode(start));
            return ret;
        }
        else{
            for(int i = start; i <= end; ++i){
                vector<TreeNode *>left = creatTrees(start, i - 1);
                vector<TreeNode *>right = creatTrees(i + 1, end);
                for(int l = 0; l < left.size(); ++l)
                    for(int r = 0; r < right.size(); ++r){
                        auto root = new TreeNode(i);
                        root->left = left[l];
                        root->right = right[r];
                        ret.push_back(root);
                    }
            }
            return ret;
        }
    }
};

 

posted on 2014-11-25 09:10  远近闻名的学渣  阅读(162)  评论(0)    收藏  举报

导航