LeetCode —— Unique Binary Search Trees [动态规划]

转载自http://www.tuicool.com/articles/NRjmyyI

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

Tree Dynamic Programming

如果集合为空,只有一种BST,即空树,

UniqueTrees[0] =1

如果集合仅有一个元素,只有一种BST,即为单个节点UniqueTrees[1] = 1

UniqueTrees[2] = UniqueTrees[0] * UniqueTrees[1]   (1为根的情况)+ UniqueTrees[1] * UniqueTrees[0]  (2为根的情况。

再看一遍三个元素的数组,可以发现BST的取值方式如下:

UniqueTrees[3] = UniqueTrees[0]*UniqueTrees[2]  (1为根的情况)

+ UniqueTrees[1]*UniqueTrees[1]  (2为根的情况)

+ UniqueTrees[2]*UniqueTrees[0]  (3为根的情况)

也就是说1为根时,1的左子树只能是空树,右子树是含2个节点的树;

2为根时,2的左子树是含1个节点的树,右子树也是含1个 节点的树;

3为根时,左子树是含2个节点的树,右子树为空树;


所以,由此观察,可以得出UniqueTrees的递推公式为UniqueTrees[i] = ∑ UniqueTrees[0...k] * [i-1-k]     k取值范围 0<= k <=(i-1)

”’

Created on  Nov 13, 2014

@author:  ScottGu<gu.kai.66 @gmail.com , 150316990 @qq.com >

”’

class   Solution :

# @return an integer

def  numTrees( self  , n):

uniqueTrees={}

uniqueTrees[ 0  ]= 1

uniqueTrees[ 1  ]= 1

for  cnt  in range(  2 , n+ 1  ):

uniqueTrees[cnt]= 0

for  k  in range(  0 , cnt):

uniqueTrees[cnt]+=uniqueTrees[k]*uniqueTrees[cnt- 1  -k]

return  uniqueTrees[n]

if  __name__ ==  ‘__main__’ :

sl=Solution()

print  sl.numTrees( 0  ),  0

print  sl.numTrees( 1  ),  1

print  sl.numTrees( 2  ),  2

print  sl.numTrees( 3  ),  3

print  sl.numTrees( 4  ),  4

print  sl.numTrees( 5  ),  5

猜你喜欢

转载自blog.csdn.net/ZHUJIANWEILI4/article/details/45046683