★96. 不同的二叉搜索树(动态规划)

96. 不同的二叉搜索树

考虑动态规划算法。
需要好好学

f[n]表示长度为n的序列能够组成的不同二叉搜索树的数量。
则有n种可能为根节点,设当前的根节点为i,那左子树就有i-1个节点,右子树有n-i个节点。
那左子树就转化为长度为i-1的序列能组成多少种二叉搜索树的数量,右子树就转换为长度为n-i的二叉搜索树的数量。
那左子树就是f[i-1],右子树就是f[n-i]。那就是一个动态规划的问题,大问题转化为小问题。

考虑边界情况:n=0时,组成的不同二叉搜索树的数量为1,n=1时,组成的不同二叉搜索树的数量也为1.
所以边界情况是f[0] = f[1] = 1for(int i=2;i<=n;i++)
	for(int j=1;j<=i;j++)
		f[i] += f[j-1] * f[i-j];
class Solution {
    
    
    public int numTrees(int n) {
    
    
        // f[n] = i~(1,...n) f[i-1]*f[n-i]
        int[] f = new int[n+10];
        f[0] = f[1] = 1;
        for(int i=2;i<=n;i++){
    
    
            System.out.println("i=" + i);
            for(int j=1; j<=i; j++)
                f[i] += f[j-1]*f[i-j];
        }
        return f[n];
    }
}

猜你喜欢

转载自blog.csdn.net/qq_45895217/article/details/134900040