96. Unique Binary Search Trees
Total Accepted: 80679 Total Submissions: 216054 Difficulty: Medium
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
【分析】
这是我第一次接触“二叉搜索树”(Binary Search Tree,BST),二叉搜索树:又称二叉查找树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
拿到题目我想到的办法是基于DFS方法寻找可行解,但超时了,后来我查询了BST的资料,才意识到BST的规律性是很强的:若F(n)表示[1...n]能够构成的不同BST的数量,那么:
1、特殊情况,如果结点数为0,即n=0,为空树,F(0)=1;
2、如果结点数为1,即n=1,F(1)=1;
3、如果结点数为2,即n=2,F(2)=2;
4、对于n>=2的情况,事实上,1,2,..n都可以作为根节点,若i作为根节点,根据BST的性质,左子树不为空时(左子树为空,只能是i=1),左子树的所有节点必须小于根节点,即[1,i-1]必须位于左子树,同时,右子数节点必须值必须大于根节点值,则[i+1,n]必须位于右子树;
5、如上分析,对于[1,n],n>=2的情况,既然[1,n]每一个值都可以作为根节点,那我们需要遍历所有情况,时间复杂度为O(n),对于任何一种情况:根节点为i,则[1,i-1]为左子树,[i+1,n]为右子树,左子树有能够构成不同的BST的数量为:F(i-1),右子树能够构成的不同BST的数量为F(n-i);
左右植树相互独立,那么:F(n)=F(i-1)*F(n-i),i属于[1,n],i有n种情况,须完全遍历
6、进一步地,我们将这个问题数学化:
7、根据上面的公式,写出代码很容易,两重循环,时间复杂度O(n2)
【解法及注释】
class Solution { public: int numTrees(int n) { vector<int> node(n+1,0);//注意细节n+1 node[0]=1; node[1]=1; //n=0,1时处理方式 if(n==0)return 1; if(n==1)return 1; //n>=2时处理方式 for(int i=2;i<=n;i++) { for(int j=1;j<=i;j++) node[i]+=node[j-1]*node[i-j]; } return node[n]; } };