• 困难
  • 中等
  • 简单

    题目描述

    给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?

    来源,leetcode 每日一题 96. 不同的二叉搜索树

示例:

  1. 输入:3
  2. 输出:5
  3. 解释:
  4. 以上的输出对应以下 5 种不同结构的二叉搜索树:
  5. 1 3 3 2 1
  6. \ / / / \ \
  7. 3 2 1 1 3 2
  8. / / \ \
  9. 2 1 2 3
  10. 来源:力扣(LeetCode
  11. 链接:https://leetcode-cn.com/problems/unique-binary-search-trees-ii
  12. 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

  1. 递归的想法,二叉树是有序树,对于一棵树而言,当第i个节点为根时,其将[1,i-1]和[i+1, n]分成了两个子树,则此时只需要对两个子树分别构建,然后将他们拼接到i上即可。
  2. 需要学会问题分解!
  3. image.png

96. 不同的二叉搜索树 - 图2其实是关于96. 不同的二叉搜索树 - 图3的一个函数,其表达式为96. 不同的二叉搜索树 - 图4
,由此可以得到96. 不同的二叉搜索树 - 图5.

代码

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

image.png

  1. class Solution {
  2. public:
  3. int numTrees(int n) {
  4. long 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. };