提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
leetcode第一天: 1. 二叉查找树的生成(回溯法) 2. 二叉树的个数(动态规划)提示:以下是本篇文章正文内容,下面案例可供参考
一、回溯法生成二叉查找树(95)
1.问题描述: 给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。二、代码如下
第一题代码如下class Solution {
public:
vector<TreeNode*> generate(int s, int e)
{
if (s > e)
{
return{ nullptr };
}
vector<TreeNode *> r;
for (int i = s; i <= e; i++)//生成根节点
{
vector<TreeNode *>lefta = generate(s, i - 1);//生成左子树
vector<TreeNode *>righta = generate(i + 1, e);//生成右子树
for (auto &j : lefta)//从左子树集合与右子树集合中选出子树
{
for (auto &k : righta)
{
TreeNode *h = new TreeNode;
h->val = i;
h->left = j;
h->right = k;
r.push_back(h);
}
}
}
return r;
}
vector<TreeNode*> generateTrees(int n) {
if (n == 0)
{
return {};
}
return generate(1, n);
}
};
2.问题描述(96)
给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
代码如下 :
class Solution {
public:
int numTrees(int n) {
if(n==0)
{
return 0;
}
int dp[20][20];
for(int i=1;i<=n;i++)//初始化
{
dp[i][i]=1;
}
for(int i=1;i<=n-1;i++)//长度为i
{
for(int j=1;j<=n-i;j++)//其实为j,终止为j+i
{
int sum=0;
for(int k=j;k<=j+i;k++)//k是根
{
if(k==j)
{
sum+=dp[k+1][j+i];
continue;
}
if(k==j+i)
{
sum+=dp[j][j+i-1];
continue;
}
sum+=dp[j][k-1]*dp[k+1][j+i];
}
dp[j][j+i]=sum;
}
}
return dp[1][n];
}
};