96の異なるバイナリ検索ツリー

タイトル説明

整数nは、1 ... nは二分探索木のノードに求めている、何を考えますか?

アイデア解析

まず観察は、我々はシーケンス1-nは、根から選ばiは、1-iは左のサブツリーのは、中右部分木であるか見ることができる、私は別の根の数は、BSTの製品サブツリー異なる状況についてです。

例えば1234根から選択は、F(2,4)= O(1)* O(2)に対応する、2、左の部分木、右の部分木34を行います

この発見は、全体に拡大する、に見出すことができるO(N)=Σ
O(-I 1)* O(Ni)から。

再帰的なソリューションの複雑移動規制と、高いです。規制は小さな問題との両方を保存することができ、サブ問題の解決に大きな問題を移動することができます!

注:これは数Cartlandであることを発見するだけで解決を見てください。

コードの実装

    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