本题结构稍微复杂,先循环,分治,然后递归,再嵌套循环。
先用循环把每个数依次选做根节点,然后用分治的思想,把整体分成俩个子问题,小于根节点的分成一部分当左子树,大于根节点的当右子树,然后递归地把子问题再分成俩个子问题,直到子问题为一个节点,然后逐层返回。再用循环把俩个子树的不同结构连接到根节点。有多少个数就重复上述过程多少次。
具体代码实现如下 :
/**
* 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) {
if(n<=0) return {};
return creatTrees(1,n);
}
vector<TreeNode*> creatTrees(int start, int end)
{
vector<TreeNode*> res;
if(end < start)
{
res.push_back(NULL);
return res;
}
for(int i = start; i <= end; i++)
{
vector<TreeNode*> left = creatTrees(start, i -1);
vector<TreeNode*> right = creatTrees(i + 1, end);
for(auto l: left)
for(auto r: right)
{
TreeNode* root = new TreeNode(i);
root->left = l;
root->right = r;
res.push_back(root);
}
}
return res;
}
};