- 对于一个含有n个数的有序数组1~N,能够产生多少种不同结果的二叉搜素树BST?
- 如何生成这些不同结构的BST?
- 有序数组如何生成平衡二叉搜索树?
1 class Solution {
2 public:
3 int numTrees(int n) {
4 int* dp = new int[n+1];
5 dp[0] = 1;
6 dp[1] = 1;
7 dp[2] = 2;
8 for(int i=3;i<=n;i++){
9 dp[i] = 0;
10 for(int j=1;j<=i;j++){
11 dp[i]+=dp[j-1]*dp[i-j];
12 }
13 }
14 return dp[n];
15 }
16
17 int numTrees2(int n){
18 if(n==0) return 1;
19 if(n < 3) return n;
20 int sum = 0;
21 for(int i=1;i<=n;i++){
22 sum += numTrees2(i-1)*numTrees2(n-i);
23 }
24 return sum;
25 }
26 };
1 /**
2 * Definition for binary tree
3 * struct TreeNode {
4 * int val;
5 * TreeNode *left;
6 * TreeNode *right;
7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
8 * };
9 */
10
11 class Solution {
12 public:
13 vector<TreeNode *> generateTrees(int left, int right) {
14 vector<TreeNode*> res;
15 if (left > right) {
16 res.push_back(nullptr);
17 return res;
18 }
19
20 if(left == right){
21 res.push_back(new TreeNode(left));
22 return res;
23 }
24
25 for (int i = left; i <= right; i++) {
26 //TreeNode* root = new TreeNode(i);
27 vector<TreeNode*> leftRes = generateTrees(left, i-1);
28 vector<TreeNode*> rightRes = generateTrees(i + 1, right);
29 for (size_t j = 0; j < leftRes.size(); j++) {
30 for (size_t k = 0; k < rightRes.size(); k++) {
31 TreeNode* root = new TreeNode(i);
32 root->left = leftRes[j];
33 root->right = rightRes[k];
34 res.push_back(root);
35 }
36 }
37 }
38 return res;
39 }
40
41 vector<TreeNode*> generateTrees(int n){
42 vector<TreeNode*> res;
43 if(n == 0) {
44 res.push_back(nullptr);
45 return res;
46 }
47 return generateTrees(1,n);
48 }
49
50 };