给你一个整数 n
,请你生成并返回所有由 n
个节点组成且节点值从 1
到 n
互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。
示例 1:
输入:n = 3 输出:[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]]
示例 2:
输入:n = 1 输出:[[1]]
提示:
1 <= n <= 8
vector<vector<vector < TreeNode*>> > memoVec;
vector <TreeNode*> countNum(int left,int right, vector<vector<vector < TreeNode*>> > &memoVec)
{
if (right <= left)
{
if (memoVec[left][left].size() != 0)
{
return memoVec[left][left];
}
TreeNode* node = new TreeNode(left);
memoVec[left][left].push_back(node);
return memoVec[left][left];
}
if (memoVec[left][right].size() != 0)
{
return memoVec[left][right];
}
vector<TreeNode*>ret;
for (int mid = left; mid <= right; mid++)
{
if (mid == left)
{
vector <TreeNode*> rightVec = countNum(mid + 1, right, memoVec);
for (int r = 0; r < rightVec.size(); r++)
{
TreeNode* node = new TreeNode(mid);
node->right = rightVec[r];
ret.push_back(node);
}
continue;
}
if (mid == right)
{
vector <TreeNode*> leftVec = countNum(left, mid-1, memoVec);
for (int l = 0; l < leftVec.size(); l++)
{
TreeNode* node = new TreeNode(mid);
node->left = leftVec[l];
ret.push_back(node);
}
continue;
}
vector <TreeNode*> leftVec= countNum(left, mid - 1, memoVec);
vector <TreeNode*> rightVec = countNum( mid + 1,right ,memoVec);
for (int l = 0; l < leftVec.size(); l++)
{
for (int r = 0; r < rightVec.size(); r++)
{
TreeNode* node = new TreeNode(mid);
node->left = leftVec[l];
node->right = rightVec[r];
ret.push_back(node);
}
}
}
memoVec[left][right] = ret;
return ret;
}
vector<TreeNode*> generateTrees(int n) {
vector<vector<vector < TreeNode*>> > memoVec(n+1,vector<vector<TreeNode*>>(n+1,vector<TreeNode*>()));
vector <TreeNode*> leftVec = countNum(1, n, memoVec);
return leftVec;
}