题目
给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
示例
输入:n = 3
输出:5
输入:n = 1
输出:1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/unique-binary-search-trees
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
方法1
【1,2,3,4,5】,若3为根结点,有2X2=4种组合。定义一个count方法
当lo > hi闭区间[lo, hi]肯定是个空区间,也就对应着空节点 null,虽然是空节点,但是也是一种情况,所以要返回 1 而不能返回 0。
备忘录为n+1,是因为计算1-n。
备忘录memo,消除重叠子问题。
Python实现
class Solution:
def numTrees(self, n: int) -> int:
#备忘录,初始值都为0
memo=[[0]*(n+1) for i in range(n+1)]
def count(low,high):
//空结点返回1
if low>high: return 1
if memo[low][high]!=0: return memo[low][high]
//递归计算每个数做结点的可能性
res=0
for i in range(low,high+1):
left=int(count(low,i-1))
right=int(count(i+1,high))
res+=left*right
memo[low][high]=res
return res
return count(1,n)
Java实现
class Solution {
// 存储i-j的数构成的BST数目
int[][] nums;
public int numTrees(int n) {
nums = new int[n + 1][n + 1];
return count(1, n);
}
public int count(int low, int high) {
if (low > high) {
return 1;
}
// 检查nums是否存储数目
if (nums[low][high] != 0) {
return nums[low][high];
}
// 计数
int num = 0;
for (int i = low; i <= high; i++) {
int left = count(low, i - 1);
int right = count(i + 1, high);
num += left * right;
}
nums[low][high] = num;
return num;
}
}