📌  相关文章
📜  由 H+1 个节点组成的高度为 H 的二叉搜索树的数量(1)

📅  最后修改于: 2023-12-03 15:27:13.741000             🧑  作者: Mango

题目介绍

本题需要计算由 H+1 个节点组成的高度为 H 的二叉搜索树的数量,即给定节点数和树高,求符合条件的二叉搜索树个数。

二叉搜索树定义:左子树所有节点的值均小于根节点的值,右子树所有节点的值均大于根节点的值。节点数为H+1,高度为H。

示例

当节点数为5(H=4)时,符合条件的二叉搜索树可能如下:

    1           1           1           3           3
   /           /           / \         / \         / \
  2           3           4   2       1   4       5   1
 /             \                     /             \
3               4                   2               4

思路分析

对于一棵二叉搜索树,它的根节点左子树节点数和右子树节点数的和为总节点数减1。可以通过枚举左子树节点数得到右子树节点数,再使用动态规划算法计算左子树和右子树的数量相乘得到总数量。具体算法如下:

  1. 初始化一个大小为 H+1 的dp数组,dp[i]表示i个节点构成的所有二叉搜索树数量。
  2. 初始化dp[0] = 1,dp[1] = 1。
  3. 对于节点数为i的二叉搜索树,枚举左子树节点数j(0≤j≤i-1),右子树节点数为i-j-1,左子树和右子树数量相乘累加到总数量中去。
  4. 返回总数量。

代码实现

def numTrees(n: int) -> int:
    if n < 2:
        return 1
    dp = [0] * (n + 1)
    dp[0] = 1
    dp[1] = 1
    for i in range(2, n + 1):
        for j in range(i):
            dp[i] += dp[j] * dp[i-j-1]
    return dp[n]

部分测试用例

输入:5
输出:42

输入:0
输出:1

输入:1
输出:1

时间复杂度

本算法采用动态规划思想,时间复杂度为O(n^2)。

空间复杂度

本算法的空间复杂度为O(n),即需要一个大小为H+1的dp数组。