Unique Binary Search Trees 不同的二叉搜索树

给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?

示例:

输入: 3
输出: 5
解释:
给定 n = 3, 一共有 5 种不同结构的二叉搜索树:

   1         3     3      2      1
    \       /     /      / \      \
     3     2     1      1   3      2
    /     /       \                 \
   2     1         2                 3

思路

这道题完全没有思路,想通过动态规划来找规律发现很难找,于是直接看了discuss和其他博客的解答,这里做下记录:

直接看规律dp[n]表示有n有几种情况,规定空子树也是一种情况dp[0]=1:

n=1时,一共有dp[1]=1种情况。

1 

n=2时,一共有dp[0]*dp[1]+dp[1]*dp[0]种情况,即左边0个节点*右边1个节点+左边1个节点*右边0个节点的总数。

   1         1   
    \       /  
     2     2    
n=3时,一共有dp[0]*dp[2]+dp[1]*dp[1]+dp[2]*dp[0]种情况,对应左0*右2+左1*右1+左2*右0的情况。

   1      1          2       3      3      
    \      \        / \     /      /    
     3      2      1   3   2      1   
    /        \            /        \    
   2          3          1          2    

代码如下:

    int numTrees(int n) {
	vector<int> res( n + 1,0 );
	res[0] = 1;
	res[1] = 1;
	for (int i = 2; i <= n; i++) {
		for (int j = 0; j < i; j++) {
			res[i] += res[j] * res[i - j-1];
		}
	}
	return res[n];        
    }


猜你喜欢

转载自blog.csdn.net/qq_26410101/article/details/80528677