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