Leetcode--96. 不同的二叉搜索树(java)
給定一個整數 n,求以?1 ...?n?為節點組成的二叉搜索樹有多少種?
示例:
輸入: 3
輸出: 5
解釋:
給定 n = 3, 一共有 5 種不同結構的二叉搜索樹:
? ?1 ? ? ? ? 3 ? ? 3 ? ? ?2? ? ? ?1
? ? \ ? ? ? / ? ? /? ? ? ? ? / \? ? ? ? \
? ? ?3 ? ? 2 ? ? 1 ? ? ?1 ? 3 ? ? ?2
? ? / ? ? / ? ? ? \? ? ? ? ? ? ? ? ? ? ? \
? ?2 ? ? 1 ? ? ? ? 2? ? ? ? ? ? ? ? ? ?3
思路:
G(n)= i=1∑n? F(i,n)? ? (1)
每一個結點都可以當根節點,以第i個結點為例,
左子樹是從第1到i-1個結點,右子樹是第i+1到第n個結點
res[i]表示第i個結點為根節點時,搜索樹有多少種
舉例:
n=7? ?1? 2? 3? 4? 5? 6? 7
3為根節點時,左子樹1? 2? 右子樹 4? 5? 6? 7
左子樹兩個結點,可以用res[2]表示
右子樹4個結點,可以用res[4]表示
所以res[i]=res[i-1]*res[n-i]
所以F[i,n]=G[i-1]*G[n-i]? ?(2)
結合(1)(2),
G(n)= i=1∑n? G(i?1)?G(n?i)
代碼:
class?Solution?{
????//左根右
????//1?2?3
????public?int?numTrees(int?n)?{
????????int?res[]?=?new?int[n+1];
????????res[0]=1;
????????res[1]=1;
????????for(int?i=2;i<=n;i++){
????????????for(int?j=1;j<=i;j++){
????????????????res[i]?+=?res[j-1]*res[i-j];
????????????}
????????}
????????return?res[n];
????}
}
總結
以上是生活随笔為你收集整理的Leetcode--96. 不同的二叉搜索树(java)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html div 知识点,HTML知识点
- 下一篇: Leetcode--319. 灯泡开关