0
点赞
收藏
分享

微信扫一扫

leetcode [96. 不同的二叉搜索树](https://leetcode-cn.com/problems/unique-binary-search-trees/)

倪雅各 2022-03-11 阅读 83

leetcode 96. 不同的二叉搜索树

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

示例 1:

输入:n = 3
输出:5

示例 2:

输入:n = 1
输出:1

提示:

  • 1 <= n <= 19

Related Topics

二叉搜索树

数学

动态规划

二叉树

思路1:动态规划

对序列1,2,3......,n构建二叉搜索树,我们可以以i为节点,那么(1,2.....i-1)为左子树和(i+1,....n)为右子树构建二叉搜索树。将一个大问题,分解为小问题求解。

以n==4为例:

  • 当1为根节点的时候:

    • 左子树为空,只有一种可能性。

    • 右子树有3个元素,由示例1知道,3个元素构成的二叉搜索树有5种可能性。

    • 总共有有1*5种。

  • 当2为根节点的时候:

    • 左子树只有一个元素,一种可能性。

    • 右子树2个元素,2种可能性。

    • 总共1*2

  • 当3为根节点的时候:

    • 左子树2个元素,2种可能性。

    • 右子树1个元素,1种可能性。

  • 当4为根节点的时候:

    • 左子树3个元素,5种可能性,

    • 右子树为空,1种可能性。

所以:如果求长度为n的个数,必须求出来长度为n-1的个数。

长度为i的个数需要遍历以1...i为根结点的个数。当根节点为j时,左子树的个数为j-1,右子树个数为i-j

然后将以1..i为根的二叉搜索树个数加起来即可。

class Solution {
    public int numTrees(int n) {
        int[] dp = new int[n+1];
        dp[0] = 1;
        dp[1] = 1;
        for(int i = 2 ; i <= n;i++){
            for(int j = 1; j <=i;j++){
                dp[i] += dp[j-1]*dp[i-j];
            }
        }
        return dp[n];
    }
​
}
举报

相关推荐

0 条评论