LeetCode-96.不同的二叉搜尋樹(相關話題:動態規劃)
阿新 • • 發佈:2018-12-12
給定一個整數 n,求以 1 ... n 為節點組成的二叉搜尋樹有多少種?
示例:
輸入: 3
輸出: 5
解釋:
給定 n = 3, 一共有 5 種不同結構的二叉搜尋樹:
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
解題思路:
輔助陣列int[] cnt,cnt[i]表示以1 ... i+1為節點組成的二叉搜尋樹的種數([i~j]表示以i ... j為節點組成的二叉搜尋樹)
n = 1, cnt[0] = 1 可能的二叉搜尋樹結構:{null 1 null} n = 2, cnt[1] = 2 = 2*cnt[0] 可能的二叉搜尋樹結構:{null 1 [2]}、{[1] 2 null} n = 3, cnt[2] = 5 = 2*cnt[1] + cnt[0]*cnt[0] 可能的二叉搜尋樹結構:{null 1 [2~3]}、{[1] 2 [3]}、{[1~2] 3 null} n = 4, cnt[3] = 14 = 2*cnt[2] + 2cnt[0]*cnt[1] 可能的二叉搜尋樹結構:{null 1 [2~4]}、{[1] 2 [3~4]}、{[1~2] 3 [4]}、{[1~3] 4 null} ... 以此類推
Java程式碼:
class Solution { public int numTrees(int n) { if(0 == n) return 0; int[] cnt = new int[n]; if(0 < n){ cnt[0] = 1; } if(1 < n){ cnt[1] = 2; } for(int i = 2; i < n; i++){ int p = i/2, q = i%2; cnt[i] += 2*cnt[i-1]; int s = 0; while(s < (p - 1 + q)){ cnt[i] += 2*cnt[s]*cnt[i-2-s]; s++; } if(0 == q){ cnt[i] += cnt[p-1]*cnt[p-1]; } } return cnt[n-1]; } }