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
求1到n能够形成二叉查找树的所有结果,输出到数组中。
形成二叉树这个并不陌生,使用递归,
1-n,对于一个以i为根节点的树,可分成1-i,i-n两部分,用同样的方法构成;同样1-i也可以分,这样就形成了递归。
递归结束的判断就是每部分的首尾值相交。
由于需要保存所有可能的值,也就是i从1-n循环一遍,将产生的所有结果都复制-保存一遍。
动态规划思想。
求n的时候等于是在n-1的二叉树上做出所有加上n的结果。
实际上就是我们每确定一个根节点对其安装子节点树的时候查看子节点树是否之前存在过,若存在过就直接拿出来使用,return dp即可。若没有,就进行循环递归迭代然后生成后保存至dp留下次使用。
1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 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) {
vector<TreeNode *> ret;
vector<vector<vector<TreeNode *>>> dp(n,vector<vector<TreeNode *>>(n));
if(n<1){
return ret;
}
helper(1, n, ret, dp);
return ret;
}
void helper(int begin, int end, vector<TreeNode*> &ret, vector<vector<vector<TreeNode * >>> &dp){
if(begin > end){
ret.push_back(NULL);
return ;
}
if(!dp[begin-1][end-1].empty()){
ret = dp[begin-1][end-1];
return;
}
for(int i=begin; i<=end; i++){
vector<TreeNode *> left, right;
helper(begin, i-1, left, dp);
helper(i+1, end, right, dp);
for(int j=0; j<left.size();j++){
for(int k=0;k<right.size();k++){
TreeNode* node = new TreeNode(i);
node->left=left[j];
node->right=right[k];
ret.push_back(node);
}
}
}
dp[begin-1][end-1]=ret;
}
};