给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
Go语言递归实现(很多重复计算过程)
func numTrees(n int) int {
if n == 1 || n == 0 {
return 1
}
count := 0
for i := 0; i <= n-1; i++ {
count += numTrees(i) * numTrees(n-i-1)
}
return count
}
确定递归函数的参数和返回值:
参数:结点数
返回值:n个结点所构成的不同BST数量
确定终止条件:
当n=1 || n=0的时候
确定单层递归的逻辑:
计算当前某结点左右对应子树产生的BST数量乘积
上面是理论上的递归最简写法,实际执行之间过长,采用下面的递归写法
func numTrees(n int) int { //参数n,返回值是最终结果
memo := make([]int, n+1) //创建切片,make返回值是第一个元素,预设内存空间是n+1,初始值都是0
return helper(n, &memo) //因为helper函数的定义是传递指针参数,所以这里给切片的地址
}
func helper(n int, memo *[]int) int {
if n == 1 || n == 0 {
return 1
}
if (*memo)[n] > 0 { //切片对应位置存储结果,去掉重复计算的可能
return (*memo)[n]
}
count := 0
for i := 0; i <= n-1; i++ {
count += helper(i, memo) * helper(n-i-1, memo)
}
(*memo)[n] = count //将结果存在对应位置的切片中
return count
}