95. Unique Binary Search Trees II

来源:互联网 发布:杀破狼 js mp3 编辑:程序博客网 时间:2024/05/26 17:48
  1. 问题描述
    Given an integer n, generate all structurally unique BST’s (binary search trees) that store values 1…n.

    For example,
    Given n = 3, your program should return all 5 unique BST’s shown below.

    1         3     3      2      1\       /     /      / \      \ 3     2     1      1   3      2/     /       \                 \2     1         2                 3
  2. 解决思路。
    参见96.Unique Binary Search Trees,第96题要求的是二叉搜索树有多少棵,这个就很简单,分析一下就可以知道它的答案是卡特兰数。对于 1<= i <= n. 我们以i为节点,比它小的数字进行构造左边的二叉搜索树,比它大的进行构造右边的二叉搜索树。这样的情况有f(i-1)*f(n-i)。这个显然就是卡特兰数的问题了。
    这题也是一样的思路,利用递归构造子树数组即可。

  3. 代码

/** * Definition for a binary tree node. * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    vector<TreeNode*> generateTrees(int n) {        if ( n == 0)            return vector<TreeNode*>();        vector<int> nums(n,0);        for (int i = 0; i < n; ++i) {            nums[i] = i + 1;        }        return helper(nums);    }    vector<TreeNode*> helper(vector<int>nums) {        if (nums.size() == 0) {            TreeNode* leaf = NULL;            vector<TreeNode*> result;            result.push_back(leaf);            return result;        }        if (nums.size() == 1) {            TreeNode* leaf = new TreeNode(nums[0]);            vector<TreeNode*> result;            result.push_back(leaf);            return result;        }        vector<TreeNode*> result;        for (int i = 0; i < nums.size(); ++i) {            vector<int> left(i);            if (i != 0)                copy(nums.begin(),nums.begin()+i,left.begin());            vector<int> right(nums.size()-i-1);            if (nums.size()-i-1 != 0)                copy(nums.begin()+i+1,nums.end(),right.begin());            vector<TreeNode*> l_result = helper(left);            vector<TreeNode*> r_result = helper(right);            for (int m = 0; m < l_result.size(); ++m) {                for (int n = 0; n < r_result.size(); ++n) {                    TreeNode* root = new TreeNode(nums[i]);                    root->left = l_result[m];                    root->right = r_result[n];                    result.push_back(root);                }            }        }        return result;    }};
0 0
原创粉丝点击