不同的二叉搜索树

133 阅读1分钟

给你一个整数 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
}