1. 程式人生 > >面試題22:有序數組生成BST

面試題22:有序數組生成BST

++ root pre sum col push_back div fin +=

  1. 對於一個含有n個數的有序數組1~N,能夠產生多少種不同結果的二叉搜素樹BST?
  2. 如何生成這些不同結構的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 };

面試題22:有序數組生成BST