题目:
完整二叉树是一类二叉树,其中每个结点恰好有 0 或 2 个子结点。
返回包含 N
个结点的所有可能完整二叉树的列表。 答案的每个元素都是一个可能树的根结点。
答案中每个树的每个结点
都必须有 node.val=0
。
你可以按任何顺序返回树的最终列表。
示例:
输入:7 输出:[[0,0,0,null,null,0,0,null,null,0,0],[0,0,0,null,null,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,null,null,null,null,0,0],[0,0,0,0,0,null,null,0,0]] 解释:
提示:
1 <= N <= 20
思路:
中等题,其实思路不难,对于我这种手残选手而言,难的是coding。一看就是递归解决,并且一个端点只允许两种情况,无节点或者两个节点。但是其返回值是头结点,用简单的递归是返回不了头结点的,因为递归总是从上而下的,递归到最后就是子节点的。这题需要在返回的时候声明一个节点作为头结点root,然后左右递归的子返回值作为其子节点,我们就可以返回这个root了。
注意点:
递归的返回值,需要自行声明一个新的节点作为这个子树的头结点。
代码:
vector<TreeNode*> allPossibleFBT(int N) {
cout<<N<<endl;
vector<TreeNode*> ve;
if(N==0)return ve;
if(N==1){
TreeNode* ans = new TreeNode(0);
ve.push_back(ans);
return ve;
}
N = N-1;
for(int i=1;i<=N;i+=2){
vector<TreeNode*> L = allPossibleFBT(i);
vector<TreeNode*> R = allPossibleFBT(N-i);
for(TreeNode* i : L){
for(TreeNode* j : R){
TreeNode* root = new TreeNode(0);
root->left = i;
root->right = j;
ve.push_back(root);
}
}
}
return ve;
}