LeetCode: 894. All Possible Full Binary Trees
题目描述
A full binary tree is a binary tree where each node has exactly 0
or 2
children.
Return a list of all possible full binary trees with N
nodes. Each element of the answer is the root
node of one possible tree.
Each node of each tree in the answer must have node.val = 0
.
You may return the final list of trees in any order.
Example 1:
Input: 7
Output:
[[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]]
Note:
1 <= N <= 20
解题思路 —— 递归求解
将节点按照可能的情况划分给左右子树,递归地求出所有的可能性。
AC 代码
/**
* 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 {
// 拷贝二叉树
TreeNode* CopyTree(TreeNode* root)
{
if(root == nullptr) return nullptr;
TreeNode* copyRoot = new TreeNode(root->val);
copyRoot->left = CopyTree(root->left);
copyRoot->right = CopyTree(root->right);
return copyRoot;
}
public:
vector<TreeNode*> allPossibleFBT(int N) {
// 偶数节点不可能存在 FBT。
if( N % 2 == 0)
{
return {};
}
TreeNode* curRoot = new TreeNode(0);
vector<TreeNode*> ans;
--N;
if(N == 0) return {curRoot};
for(int i = 1; i < N; i += 2)
{
// 分配左右子树的节点数
vector<TreeNode*> leftTree = allPossibleFBT(i);
vector<TreeNode*> rightTree = allPossibleFBT(N-i);
for(int i = 0; i < leftTree.size(); ++i)
{
for(int j = 0; j < rightTree.size(); ++j)
{
curRoot->left = leftTree[i];
curRoot->right = rightTree[j];
ans.push_back(CopyTree(curRoot));
}
}
}
return ans;
}
};