95. 不同的二叉搜索树 II

给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。

示例 1:

输入:n = 3
输出:[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]]

示例 2:

输入:n = 1
输出:[[1]]

提示:

  • 1 <= n <= 8

 

vector<vector<vector < TreeNode*>> > memoVec;

vector <TreeNode*> countNum(int left,int right, vector<vector<vector < TreeNode*>> > &memoVec)
{

    if (right <= left)
    {
        if (memoVec[left][left].size() != 0)
        {
            return memoVec[left][left];
        }

        TreeNode* node = new TreeNode(left);
        memoVec[left][left].push_back(node);
        return memoVec[left][left];
    }

    if (memoVec[left][right].size() != 0)
    {
        return memoVec[left][right];
    }
    vector<TreeNode*>ret;
    for (int mid = left; mid <= right; mid++)
    {
        if (mid == left)
        {
            
            vector <TreeNode*> rightVec = countNum(mid + 1, right, memoVec);
            for (int r = 0; r < rightVec.size(); r++)
            {
                TreeNode* node = new TreeNode(mid);
                node->right = rightVec[r];
                ret.push_back(node);
            }
            continue;
        }
        if (mid == right)
        {
            
            vector <TreeNode*> leftVec = countNum(left, mid-1, memoVec);
            for (int l = 0; l < leftVec.size(); l++)
            {
                TreeNode* node = new TreeNode(mid);
                node->left = leftVec[l];
                ret.push_back(node);
            }
            continue;
        }
        vector <TreeNode*> leftVec= countNum(left, mid - 1, memoVec);
        vector <TreeNode*> rightVec = countNum( mid + 1,right ,memoVec);
        for (int l = 0; l < leftVec.size(); l++)
        {
            for (int r = 0; r < rightVec.size(); r++)
            {
                TreeNode* node = new TreeNode(mid);
                node->left = leftVec[l];
                node->right = rightVec[r];
                ret.push_back(node);
            }
        }
    }
    memoVec[left][right] = ret;
    return ret;
}

vector<TreeNode*> generateTrees(int n) {

    vector<vector<vector < TreeNode*>> > memoVec(n+1,vector<vector<TreeNode*>>(n+1,vector<TreeNode*>()));
    vector <TreeNode*> leftVec = countNum(1, n, memoVec);
    return leftVec;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值