欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

LeetcodeHot100不熟练题目96.不同的二叉搜索树

时间:2023-05-27
1、题目描述

给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。


示例 1:
输入:n = 3
输出:5

示例 2:
输入:n = 1
输出:1

提示:
1 <= n <= 19

2、思路及代码 1、动态规划

我们用G[n]代表n个节点可以构成的二叉搜索树的数量。f[i]表示以i为根节点的二叉搜索树数量。

对于给定的n个节点。我们需要的结果就是G[n]。
G[n] = f[1] + f[2] + f[3] + … + f[n],也就是1-n每个数字分别做根节点的元素数量和。
那么我们看f[1]。f[1] 代表1做根节点的元素数量。那么此时,以1为根的左子树节点数量为0,右子树节点数量为n - 1, 也就是(2 到n - 1这些节点)。此时左子树0个节点可以构成的二叉搜索树的数量为G[0], 右子树为G[n - 1]。所以f[1] = G[0] * G[n - 1] 。

同理我们可以得到G[n] = f[1] + f[2] + … + f[n] = G[0] * G[n - 1] + G[1] * G[n - 2] + … + G[n - 1] * G[0]

G[1] = G[0] * G[0]
G[2] = G[0] * G[1] + G[1] * G[0]
G[3] = G[0] * G[2] + G[1] *G[1] + G[2] * G[0]
可以看到G[n] 的求解依赖于G[n -1] ,G[n-2],…G[0]的
所以我们可以从小到大求出所有的G[n]

class Solution {public: int numTrees(int n) { //G数组 vector g(n + 1); // 0个节点只能组成一种二叉搜索树(空树) g[0] = 1; //从1到n进行计算 for(int i = 1; i <= n; i ++) { for(int j = 1; j <= i; j ++) { g[i] += g[j - 1] * g[i - j]; } } return g[n]; }};

2、卡特兰数

由上式可以推导出卡特兰数

class Solution {public: int numTrees(int n) { long long ans = 1; for(int i = 0; i < n; i ++) { ans = ans * 2 * (2 * i + 1) / (i + 2); } return (int) ans; }};

参考资料

https://leetcode-cn.com/problems/unique-binary-search-trees/solution/bu-tong-de-er-cha-sou-suo-shu-by-leetcode-solution/
https://zh.wikipedia.org/wiki/卡塔兰数

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。