LeetCode

来源:互联网 发布:员工监控软件 编辑:程序博客网 时间:2024/06/15 16:05

解题代码:

classSolution {

public:

    int numTrees(int n) {

        if(n<=0)

            return 0;

        if(n==1)

            return 1;

        vector<int> res(n+1,0);

        res[1]=1;

        int i=2;

        while(i<=n){

            res[i]+=res[i-1]*2;

            for(int j=i-2;j>0;j--){

                res[i]+=res[j]*res[i-j-1];

            }

            i++;

        }

        return res[n];

    }

};

解题思路:

题目要求找出由1到n共n个数组成的不同的二叉查找树的个数。设为f(n),同时,f(n)也可以理解为n个不同的数能组成不同的二叉查找树的个数。显然f(1)=1。对于n大于1的情况,我们可以考虑到,对于1<=i<=n,若i作为根节点,共有i-1个数在i的左边,它们的排列方式的可能性共有f(i-1),而有n-i个数在i的右边,它们的排列方式的可能性共有f(n-i)。因此,对于每个i作为根节点,都有f(i-1)* f(n-i)种排列方式(其中,为方便计算,设f(0)=1)。所以有:

f(n)=f(n-1)*f(0)+f(n-2)*f(1)+……+f(i-1)*f(n-i)+……+f(0)*f(n-1)

0 0