欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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,具体原理没有查到,待我问问吧。