原题链接
题目解析
给一个整数,返回所有可能的真二叉树vector<TreeNode*>类型,每棵树的val都必须为0
真二叉树:每个节点都有零个或两个元素
解题思路
要求一个含有n个节点的真二叉树,可以直接从根节点往下递归,也可以先求出一些较小数字对应的二叉树,再由较小的二叉树拼接成大叉树。
从思路上,显然第二种方法更好写一些,不过它会需要使用更多的内存空间。我这边使用的是第二种写法。
dp数组用来存放从1到n(奇数)的全部合法返回值
class Solution {
public:
vector<TreeNode*> allPossibleFBT(int n) {
vector<vector<TreeNode*>>dp(n + 1);
dp[1] = { new TreeNode(0)};
for (int i = 1; i <= n; i += 2)
{
for (int j = 1; j < i; j += 2) {
for (auto left : dp[j])
{
for (auto right : dp[i - j - 1])
{
TreeNode* tmp = new TreeNode();
tmp->left = left;
tmp->right = right;
dp[i].push_back(tmp);
}
}
}
}
return dp[n];
}
};
关于时间复杂度和空间复杂度
我看了几个题解,大伙差不多的解法算出来的不怎么统一,我水平不算高,就不在这班门弄斧了,(ps:力扣官方给的空间复杂度是o(1),这光dp里就有n+1个vector,属实是离谱了)。
感谢观看!!!!