Leetcode 不同的二叉搜索树

不同的二叉搜索树

题目描述:

给定一个整数 n,求以 1 ... n 为节点组成的 二叉搜索树有多少种?

题目链接

class Solution {
    public int numTrees(int n) {
        // 初始化
        int[] dp = new int[n+1]; // 定义为当有n个连续值的节点时,可构成的搜索树种类
        dp[0] = 1;
        dp[1] = 1;
        // 动态规划过程
        for(int i = 2 ; i<=n ; i++){ // 遍历根节点
            for(int j = 1 ; j<=i ; j++){ // 累加遍历以前的所有搜索树种类
                dp[i] += dp[j-1]*dp[i-j];
            }
        }
        return dp[n];
    }
}

这里应用到了动态规划思想,定义存储数组dp[n]为n个连续值的节点时,可构成的搜索树种类数,我们可以遍历每一个节点作为根节点,其中左子树继续的二叉搜索树种类树乘以右子树的二叉搜索树种类数,加上以前的种类数即为当前节点的种类树,这个有点类似于笛卡尔积。
其转移方程为如下:

dp[k] = dp[i-1](前半部分j) * dp[k-i](后半部分)
这里i需要从1遍历到k

详细请看代码,有疑问欢迎留言。

你可能感兴趣的:(leetcode题集,leetcode)