Problem
# Given n, how many structurally unique BST's (binary search trees)
# that store values 1...n?
#
# For example,
# Given n = 3, there are a total of 5 unique BST's.
#
# 1 3 3 2 1
# \ / / / \ \
# 3 2 1 1 3 2
# / / \ \
# 2 1 2 3
Idea
二叉查找树可以任意取根,只要满足中序遍历有序的要求就可以。
选取一个结点为根,就把结点切成左右子树,以这个结点为根的可行二叉树数量就是左右子树可行二叉树数量的乘积,
所以总的数量是将以所有结点为根的可行结果累加起来。
记得考虑 子树 为 空树 的情况。
AC
DFS (但是会Time Limit Exceeded
):
class Solution():
def numTrees(self, n):
if n <= 1:
return 1
res = 0
for i in range(0, n): # 左子树的node数 有 0~n-1种可能
res += self.numTrees(i) * self.numTrees(n-i-1)
return res
DP:
# Time: O(n^2)
# Space: O(n)
class Solution():
def numTrees(self, n):
res = [1, 1]
for i in range(2, n+1):
tmp = 0
for j in range(0, i): # 左子树的node数 有 0~n-1种可能
tmp += res[j] * res[i-j-1]
res.append(tmp)
return res[-1]
if __name__ == "__main__":
assert Solution().numTrees(3) == 5