LeetCode 95 每日一题 Day 13.
程序员文章站
2022-07-12 23:07:28
...
midium,还好
思路上,之前做过基础的,也就是96题,便想继续用动态规划做,用一个二维TreeNode表来存储0-n个对应的所有树,用另一个数组存储0-n对应能生成的树的数目。
写着写着发现还要写一个函数把每一个节点的值修改一下,嫌麻烦就换了递归的方法。
基本思路:
重载函数,接受两个值,l和r,对应左限和右限,输入后,从左到右每一个节点依次作为根节点,将根节点左右两部分递归,结果作为左子树和右子树,遍历生成所有组合,最后返回列表。
上代码
/**
* 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*> generateTrees(int n) {
if (n==0) {
return {};
}
return generateTrees(1,n);
}
vector<TreeNode*> generateTrees(int l,int r)
{
if(l>r) return { nullptr };
//if(l==r) return TreeNode(l);
vector<TreeNode*> res;
for(int i=l;i<=r;i++)
{
vector<TreeNode*> lsub=generateTrees(l,i-1);
vector<TreeNode*> rsub=generateTrees(i+1,r);
for(int j=0;j<lsub.size();j++)
for(int k=0;k<rsub.size();k++)
{
TreeNode* node=new TreeNode(i);
node->left=lsub[j];
node->right=rsub[k];
res.push_back(node);
}
}
return res;
}
};
值得注意的是,当n=0 时,应该直接返回空表,需要进行特殊处理,否则运行时间会巨长,并错误。
另外,当根节点是左限或右限时,应返回空指针,这里用的是{ nullptr },而不是我想用的NULL或者单独nullptr,具体原理没有查到,待我问问吧。