. - 力扣(LeetCode)
思路:递归。因为要是真二叉树,节点树必为奇数个。
对于左子树和右子树分别递归构造,左子树从1开始一直到n-2,右子树从n-2开始一直到1;
然后使用数组接受左右子树构造出来的所有二叉树的根节点,遍历左右子树所有的可能性,让根节点分别指向左右节点即可。最后将根节点加入答案集中。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<TreeNode*> allPossibleFBT(int n) {
vector<TreeNode*>res;
if(n==1)
{
res.push_back(new TreeNode(0));
return res;
}
for(int i=1;i<n-1;i+=2)
{
vector<TreeNode*>left=allPossibleFBT(i);
vector<TreeNode*>right=allPossibleFBT(n-i-1);
for(int m=0;m<left.size();m++)
{
for(int n=0;n<right.size();n++)
{
TreeNode*head=new TreeNode(0);
head->left=left[m];
head->right=right[n];
res.push_back(head);
}
}
}
return res;
}
};