96. 不同的二叉搜索樹

題目地址:https://leetcode-cn.com/problems/unique-binary-search-trees/

給定一個整數 n,求以 1 ... n 爲節點組成的二叉搜索樹有多少種?

示例:

輸入: 3
輸出: 5
解釋:
給定 n = 3, 一共有 5 種不同結構的二叉搜索樹:

   1         3     3      2      1
    \       /     /      / \      \
     3     2     1      1   3      2
    /     /       \                 \
   2     1         2                 3


思路
遇到這類問題,我們先自己看幾個例子
n = 1,只有1種二叉搜索樹
n = 2,有兩種二叉搜索樹

1		  2
 \ 		   \
  2		    1

n = 3,有5種二叉搜索樹,如題。
拆解這道題,

  • 1的右邊有n = 2(2,3),有2種可能
  • 2的左右分別有n=1(1)和n=1(3),有1*1種可能
  • 3的左邊有n = 2(1,2),有2種可能
  • 把以上幾種可能累加,正好是5種可能

我們可以總結規律
fn=k=0n1fkfnk1{f_n} = \sum\limits_{k=0}^{n-1}{f_k}{f_{n-k-1}}
fn{f_n}就是對應n的二叉搜索樹的數目。

參考代碼

class Solution {
public:
    int numTrees(int n) {
        if (n <= 2) return n;
        const int N = n + 1;
        int sol[N];
        
        sol[0] = 1;
        sol[1] = 1;
        sol[2] = 2;
        
        for (int i = 3; i <= n; i++) {
            sol[i] = 0;
            for (int j = 0; j < i; j++) {
                sol[i] += sol[j] * sol[i - j - 1]; 
            }
        }
        
        return sol[n];
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章