题目描述

原题链接

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

示例 1:
image.png
输入:n = 3
输出:5

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

提示:

  • 1 <= n <= 19


个人解法

Javascript

dp

  1. /*
  2. * @lc app=leetcode.cn id=96 lang=javascript
  3. *
  4. * [96] 不同的二叉搜索树
  5. */
  6. // @lc code=start
  7. /**
  8. * @param {number} n
  9. * @return {number}
  10. */
  11. var numTrees = function (n) {
  12. const dp = new Array(n + 1);
  13. dp[0] = 1;
  14. dp[1] = 1;
  15. dp[2] = 2;
  16. for (let i = 3; i <= n; i++) {
  17. let temp = 0;
  18. for (let j = 1; j <= i; j++) {
  19. temp = temp + dp[j - 1] * dp[i - j];
  20. }
  21. dp[i] = temp;
  22. }
  23. return dp[n];
  24. };
  25. // @lc code=end

Java

其他解法

Java

dp

  1. class Solution {
  2. public int numTrees(int n) {
  3. int[] G = new int[n + 1];
  4. G[0] = 1;
  5. G[1] = 1;
  6. for (int i = 2; i <= n; ++i) {
  7. for (int j = 1; j <= i; ++j) {
  8. G[i] += G[j - 1] * G[i - j];
  9. }
  10. }
  11. return G[n];
  12. }
  13. }

数学方法

image.png

  1. class Solution {
  2. public int numTrees(int n) {
  3. // 提示:我们在这里需要用 long 类型防止计算过程中的溢出
  4. long C = 1;
  5. for (int i = 0; i < n; ++i) {
  6. C = C * 2 * (2 * i + 1) / (i + 2);
  7. }
  8. return (int) C;
  9. }
  10. }

Javascript

题解链接

数学方法

  1. var numTrees = function(n) {
  2. const G = new Array(n + 1).fill(0);
  3. G[0] = 1;
  4. G[1] = 1;
  5. for (let i = 2; i <= n; ++i) {
  6. for (let j = 1; j <= i; ++j) {
  7. G[i] += G[j - 1] * G[i - j];
  8. }
  9. }
  10. return G[n];
  11. };