0%

95. 不同的二叉搜索树 II

95.不同的二叉搜索树II

题目描述:

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

数据范围:

$1\le n \le 8$

题解:

前一题,96. 不同的二叉搜索树 方案数就是左侧乘以右侧。所以左侧会有多种选择,右侧也有多种选择,需要进行组合。此外需要枚举树根,得到左侧右侧列表,然后组合,组合的时候创建根节点,接上左右子树。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
auto optimize_cpp_stdio = []()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
return 0;
}();
class Solution
{
public:
const static int maxn = 1e5 + 10;
const static int maxm = 1e5 + 10;
const int INF = 0x3f3f3f3f;
vector<TreeNode *> dp(int l, int r)
{
if (l > r)
return {nullptr};
vector<TreeNode *> ret;
for (int i = l; i <= r; ++i)
{
auto left = dp(l, i - 1);
auto right = dp(i + 1, r);
for (auto &l : left)
{
for (auto &r : right)
{
TreeNode *root = new TreeNode(i);
root->left = l, root->right = r;
ret.push_back(root);
}
}
}
return ret;
}
vector<TreeNode *> generateTrees(int n)
{
return dp(1, n);
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
auto optimize_cpp_stdio = []()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
return 0;
}();
class Solution
{
public:
const static int maxn = 1e5 + 10;
const static int maxm = 1e5 + 10;
const int INF = 0x3f3f3f3f;
int mm[20] = {1, 1, 2, 5};
int dp(int n)
{
if(mm[n] != 0)
return mm[n];
int ans = 0;
for (int i = 1; i <= n; ++i)
{
ans += dp(i - 1) * dp(n - i);
}
return mm[n] = ans;
}

int numTrees(int n)
{
return dp(n);
}
};