96. 不同的二叉搜索树

文章讲述了如何计算具有n个节点且节点值互不相同的所有可能的二叉搜索树的种类数量。解题思路基于动态规划,通过以每个节点为根节点的情况来计算总数。给出的代码实现使用了二维数组dp,通过遍历和乘法运算得到最终答案。
摘要由CSDN通过智能技术生成

不同的二叉搜索树

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

示例 1:
image.png{:width=400}

输入:n = 3
输出:5

解题思路

首先二叉搜索树的定义:
左子树的所有节点值都小于根节点的值,右子树的所有节点值都大于根节点的值。

看示例 1 可以看出,n= 3 的 时候分别以 1,2,3 为根节点,它们的种类数量相加就是 1 到 n 为节点组成的二叉搜索树的个数为 dp[n],

我们就可以来推断了,比如

1 为根节点时:dp[3] = dp[0] * dp[2] ,左子树是没有的,右子树有两个。
2 为根节点时:dp[3] = dp[1] * dp[1] ,左右各一个。
3 为根节点时:dp[3] = dp[2] * dp[0] ,左子树有两个,右子树没有。

把它们相加起来就是 1-n 组成二叉搜索树的个数

dp[3] = dp[0] * dp[2] + dp[1] * dp[1] + dp[2] * dp[0]

那么就可以推断出它的
左子树节点个数为 i-1,
右子树节点个数为 n-i,
因此以 i 为根节点的二叉搜索树有 dp[i-1] * dp[n-i] 种情况。

代码

public int numTrees(int n) {
		int[] dp = new int[n+1];
		dp[0] = 1; // dp[0] 等于 0,也是说得通的,但是 我们的递推公式是乘法,所以不能是 0
		for(int i = 1;i<=n;i++){
			for(int j=1;j<=i;j++){
				dp[i]+=dp[j-1]*dp[i-j];
			}
		}
		return dp[n];
    }

这里普及一下:为什么是左子树 * 右子树 ?

对于一颗 BST 而言,左子树的所有节点的值都小于根节点的值,右子树的所有节点的值都大于根节点的值。因此,左子树的节点数和右子树的节点数已经决定了整颗 BST 的形态,而不是左子树和右子树的种类数量之和。所以,左子树的种类数量乘右子树的种类数量才是以当前节点为根节点的 BST 的种类数量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值