【LeetCode】96. Unique Binary Search Trees 解法及注释

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、进一步地,我们将这个问题数学化:

                               【LeetCode】96. Unique Binary Search Trees 解法及注释_第1张图片

         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];
    }
};



你可能感兴趣的:(LeetCode,C++,unique,search,binary,数学分析,解法及注释)