由Leetcode96.Unique_Binary_Search_Trees中的递推公式,我们可知,生成一棵n个节点的二叉搜索树需要固定一个根节点,然后用剩余(n-1)个节点组合左右子树,组合所有可能性。
由此,我们可以递归的解决这个问题。
时间复杂度:
O
(
4
n
n
)
O(\frac{4^n}{\sqrt{n}})
O(n4n)
C++代码:
class Solution {
public:
vector<TreeNode*> generateTrees(int n) {
if (n == 0)
return {};
return generateSubTrees(1, n);
}
vector<TreeNode*> generateSubTrees(int st,int en)
{
if (st > en)
return { nullptr };
vector<TreeNode*> result;
for (int i = st; i <= en; i++)
{
vector<TreeNode*> leftSon = generateSubTrees(st, i - 1);
vector<TreeNode*> rightSon = generateSubTrees(i + 1, en);
for (int j = 0; j < leftSon.size(); j++)
{
for (int k = 0; k < rightSon.size(); k++)
{
TreeNode* root = new TreeNode(i);
root->left = leftSon[j];
root->right = rightSon[k];
result.push_back(root);
}
}
}
return result;
}
};