题目
Given 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
紧接上一题,要给出所有的二叉树。
递推公式相似:
第[l~m]即[l~m+1)时的合法组合n(l,m+1)=n(l,l)*n(l+1,m)+n(l,l+1)*n(l+2,m)+...n(l,m)*n(m+1,m+1)。
dp,长度递增,开始位置递增,由递推公式求得相应长度、相应开始位置下的二叉树。
长度为1时即为其实位置的元素本身。
由于只需要返回根节点,每次组合只需要构建新的根节点,子树部分可以共用。
代码:
/**
* Definition for binary tree
* 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) {
TreeNode *tn;
vector<vector<vector<TreeNode *>>> data(n+2,vector<vector<TreeNode *>>(n+2,vector<TreeNode *>(0)));
//data[i][j]保存从i~j的所有BST树
for(int i=1;i<=n+1;i++) //初始化
for(int j=0;j<i;j++)
data[i][j].push_back(NULL);
for(int i=1;i<=n;i++)
{
tn=new TreeNode(i);
data[i][i].push_back(tn);
}
data[0][0].push_back(NULL);
for(int len=2;len<=n;len++) //DP
for(int i=1;i<=n-len+1;i++)
{
int j=i+len-1;
for(int k=i;k<=j;k++)
for(int l=0;l<data[i][k-1].size();l++)
for(int m=0;m<data[k+1][j].size();m++)
{
tn=new TreeNode(k); //相同子树公用相同空间
tn->left=data[i][k-1][l];
tn->right=data[k+1][j][m];
data[i][j].push_back(tn);
}
}
return data[1][n];
}
};