leetcode 96. 不同的二叉搜索树
给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种
示例:
输入: 3
输出: 5
解释:
给定 n = 3, 一共有 5 种不同结构的二叉搜索树:
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
解题思路:
-
有n个数,因为是二叉树,考虑以第i个元素为根节点
-
则分成了左子树和右子树,考虑左子树的节点数从0到j个,右子树从j+1到i共i-j-1个,左右子树组和相乘;
-
初始当只有一个点和两个点时构成的二叉树都只有一种
C/C++题解:
class Solution {
public:
int numTrees(int n) {
vector<int> dp(n + 1, 0);
dp[0] = 1; //一个数
dp[1] = 1; //两个数构成的数都只有一种
for (int i = 2; i <= n; i++) {//i从2开始表示3个数,以i为根
for (int j = 0; j < i; j++) {//左子树dp[j-1]个,右子树dp[i-j]个,左右子树组合相乘
dp[i] += dp[j] * dp[i - j - 1];}}//最后n个数的种类
return dp[n]; }};
Debug结果:
Java题解:
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++) {//i从2开始表示3个数,以i为根
for (int j = 0; j < i; j++) {//左子树dp[j-1]个,右子树dp[i-j]个,左右子树组合相乘
dp[i] += dp[j] * dp[i - j - 1];}}//最后n个数的种类
return dp[n]; }}
Debug结果:
Python题解:
class Solution(object):
def numTrees(self, n):
""":type n: int:rtype: int"""
dp = [0] * (n + 1)
dp[0] = 1 #一个数
dp[1] = 1 #两个数构成的数都只有一种
for i in range(2, n+1): #i从2开始表示3个数,以i为根
for j in range(i): #左子树dp[j-1]个,右子树dp[i-j]个,左右子树组合相乘
dp[i] += dp[j] * dp[i - j - 1]
#最后n个数的种类
return dp[n]
Debug结果:
更多题解移步公众号免费获取