96不同的二叉搜索树

题目描述

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

思路分析

先观察,我们可以发现序列1-n,选i做根,则1-i为左子树,i-n为右子树,则i根的不同bst个数就是左右子树不同情况的乘积。

eg. 1234,选2做根,左子树1,右子树34,相当于F(2,4)=O(1)*O(2)

将这个发现拓展到全体,可以发现O(n)=∑
O(i-1)*O(n-i)。

递归求解复杂度高,用动规。动规能把大问题分解成小规模问题,并能存储并重用子问题的解!

注:看解析才发现,这也是卡特兰数。

代码实现

    public int numTrees(int 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];
            }
        }
        return dp[n];
    }
发布了117 篇原创文章 · 获赞 8 · 访问量 3700

猜你喜欢

转载自blog.csdn.net/qq_34761012/article/details/104566393