题目:
二叉搜索树定义:
左子树的节点均小于根(root)节点,右子数的节点均大于根(root)节点。
Approach one:
注:容易理解,但是时间复杂度大。
分析:当给定n时,要求出有n个节点的不重复的二叉查找树。
1.在n个节点中,有n中方式可以作为树的根节点;
2.当i为根节点时,1~i-1都在根节点的左子树上,i+1~n都在根节点的右子树上,而左右子树也都是二叉查找树。根据排列组合可以得到,当i为根节点时,不重复的二叉树数为左子树数量乘以右子数的数量。即Root(i) = numTrees(i-1) * numTrees(n-i);
3.所以,numTrees(n) = Root(1) + Root(2) + Root(3) +......+ Root(n);
代码:
class Solution(object):
def numTrees(self, n):
num = 0
if n==0 or n==1:
return 1
for i in range(1,n+1):
num += self.numTrees(i-1)*self.numTrees(n-i)
return num
Approach two:
分析:
代码:
class Solution(object):
def numTrees(self, n):
# 定义n+1个元素的列表,且列表内元素全为0
G = [0]*(n+1)
G[0], G[1] = 1, 1
for i in range(2, n+1):
# 获取含有i个节点数的不同二叉搜索树个数G[i]
for j in range(1,i+1):
G[i] += G[j-1]*G[i-j]
return G[n]
if __name__=="__main__":
solution = Solution()
print(solution.numTrees(3))