LeetCode96. 不同的二叉搜尋樹
阿新 • • 發佈:2019-01-29
給定一個整數 n,求以 1 ... n 為節點組成的二叉搜尋樹有多少種?
示例:
輸入: 3 輸出: 5 解釋: 給定 n = 3, 一共有 5 種不同結構的二叉搜尋樹: 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3
題目分析:假設a[i-1]表示有1...(i-1)個節點組成的二叉搜尋樹的種類數,那麼我們如何求a[i]呢?
求解a[i]可以分為以下幾種情況:
第一種情況,根節點為1,那麼左子樹必定為空,右子樹為2...i個節點,那麼種類數為1*a[i-1],也可以表示為a[0]*a[i-1],即左邊0個節點的情況,右邊有i-1個節點的情況,它們之間是乘的關係。
第二種情況,根節點為2,那麼左子樹節點為1,右子樹為3...i個節點,即a[1]*a[i-2]
第三種情況,根節點為3,那麼左子樹節點為1,2,右子樹為4...i個節點,即a[2]*a[i-3]
...
故a[i]的表示式為a[i] = a[0]*a[i-1] + a[1]*a[i-2] + a[2]*a[i-3] + ... + a[i-1]*a[0]
程式碼展示:
class Solution {
public:
int numTrees(int n) {
vector<int> vec(n+1);
vec[0] = 1;
vec[1] = 1;
for(int i=2;i<=n;i++)
for(int j=0;j<i;j++)
vec[i] += vec[j]*vec[i-j-1];
return vec[n];
}
};