96. 不同的二叉搜索树

140 阅读1分钟

image.png

dp

  • 由于是搜索树,所以左子树所有的值都比当前节点小,右节点所有值都比当前节点大
  • 当n个节点时,从1到n都有可能当根结点,那么假设i为根结点时,左子树所有节点必是1到i - 1,右子树节点必是i + 1到n。
  • 根为 i 的所有二叉搜索树的集合是左子树集合和右子树集合的笛卡尔积
// 1 2 3 4 5 6 7 8 9
//     j     i     n
class Solution {
    public int numTrees(int n) {
        // dp[n]表示恰由n个节点组成互不相同的二叉搜索树有多少种
        int[] dp = new int[n + 1];
        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];//dp与节点值无关
            }
        }
        return dp[n];
    }
}