Unique binary search trees 唯一二叉搜索树

题目

  • Given n, how many structurally unique BST’s (binary search trees) that store values 1 … n?

  • Example:

Input: 3
Output: 5
Explanation:
Given n = 3, there are a total of 5 unique BST’s:

在这里插入图片描述
题意:给定数n ,二叉树的结点的值分别为1,2… …n。问能组成多少种不同的二叉搜索树。

二叉搜索树的性质: 在任一结点r的左(右)子树中,所有结点(若存在)均小于(大于)r。更一般性的特点是:任何一颗二叉树是二叉搜索树,当且仅当其中序遍历序列为单调非降。

基础知识一定要扎实,不然看到这题懵逼。。。

  • 方法一: 递归
    思路: 空树和只有根节点时,也为BST。对于一点i,当其为根节点时,左子树的节点的个数为 i - 1,(为 1,… n-1),右子树为 n-i(i+1, … n)。对于一个根来说,唯一二叉树的个数为左子树结点的个数乘以右子树结点的个数。而根节点可以从1到n中选择。

  • 在这里我报了Time Limit Exceeded错误。

class Solution{
public:
	int numTrees(int n)
	{
		if(n <= 1)  return 1;
		int sum = 0;
		for(int i = 1; i <= n; i++)
		{
			sum += numTrees(i - 1)*numTrees(n - i);
		}
		return sum;
	}
}
  • 方法二:

还有大神说这是Catalan Number卡特兰数的一个例子。卡特兰数的的递推公式:
在这里插入图片描述
可以使用动态规划解决问题。维护向量sumNode,sumNode[i]为结点个数为i时,唯一二叉搜索树的个数。和这题相对应的意义,可以写出n较小的情况。

  • 时间上每次求解i个结点的二叉查找树数量的需要一个i步的循环,总体要求n次,所以总时间复杂度是O(1+2+…+n)=O(n^2)。空间上需要一个数组来维护,并且需要前i个的所有信息,所以是O(n)。"
    在这里插入图片描述
class Solution {
public:
    int numTrees(int n) 
    {
        vector<int> sumNode(n+1,0);
        sumNode[0]=1;
        sumNode[1]=1;

        for(int i=2;i<=n;++i)
            for(int j=0;j<i;++j)  //j符合条件时,最大为i-1,对照公式
                sumNode[i]+=sumNode[j]*sumNode[i-j-1];

        return sumNode[n];  
    }
};

猜你喜欢

转载自blog.csdn.net/qq_22613757/article/details/84036501