版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/musechipin/article/details/82758980
这个问题还是常规的递归问题,不太一样的是每个整数都将会返回一个vector<TreeNode*>。所以找到这个vector之后需要再用两个for循环遍历所有的左右子树可能的组合。
几个注意事项:
1.完全二叉树一定是一个奇数,所以偶数可以直接返回空。
2.一棵完全二叉树的左右子树都是技术,所以遍历的时候不是i++而是i+=2。
3.vector在建立后,如果没有初始化值,不可以用下标访问。本来我想用vector的下标作为N,将cache定义为一个
vector<vector<TreeNode*>>,但是后面访问的时候有错,改为map<vector<TreeNode*>>即可。
class Solution {
public:
vector<TreeNode*> allPossibleFBT(int N) {
map<int, vector<TreeNode*>> cache;
vector<TreeNode*> res;
if (N % 2 == 0) return res;
if (N == 1)
{
cache[1].push_back(new TreeNode(0));
}
for (int i = 1; i <= N - 2; i=i+2)
{
int l = i;
int r = N - 1 - i;
cache[l] = allPossibleFBT(l);
cache[r] = allPossibleFBT(r);
for (int p = 0; p < cache[l].size(); p++)
for (int q = 0; q < cache[r].size(); q++)
{
TreeNode* root = new TreeNode(0);
root->left = cache[l][p];
root->right = cache[r][q];
cache[N].push_back(root);
}
}
return cache[N];
}
};