LeetCode 96 不同的二叉搜索树I

Leetcode 96 不同的二叉搜索树

/**动态规划
 * 状态定义: 
 *       DP[n]表示1~n个节点构成的二叉搜索树总数, 等于以i (1<=i<=n)为根节点的二叉搜索树数量之和
 * 状态递推:  
 *       根节点i左侧由 i-1 个节点构成,数量为 DP[i-1]; 右侧由 n-i 个节点构成,数量为DP[n-i]
 *       因此以i为根节点的二叉搜索树总数为 DP[i-1]*DP[n-i]
 *       即 DP[n] = DP[0]*DP[n-1] + ... + DP[n-1]*DP[n]
 * 初始状态: 
 *       DP[0] = 1(空树); DP[1] = 1(一个根节点); DP[2] = DP[0]*DP[1] + DP[1]*DP[0]; ...
 * */
class Solution {
    public int numTrees(int n) {
        
        //状态定义及初始状态
        int[] dp = new int[n+1];
        dp[0] = 1;    
        dp[1] = 1;

        //状态递推
        //dp[n] = dp[0]*dp[n-1] + dp[1]*dp[n-2] + ... + dp[n-2]*dp[1] + dp[n-1]*dp[0]
        //dp[n-1] -> dp[n]
        for(int end=2; end<=n; end++){
            for(int root=1; root<=end; root++){
                dp[end] += dp[root-1]*dp[end-root];
            }
        }

        //返回值  
        return dp[n];
    }
}
posted @ 2020-07-21 08:52  CodeSPA  阅读(70)  评论(0编辑  收藏  举报