給定一個整數 n,求以 1 ... n 為節點組成的二叉搜索樹有多少種?
示例:
輸入: 3 輸出: 5 解釋: 給定 n = 3, 一共有 5 種不同結構的二叉搜索樹: 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3
思路:根節點有左子樹和右子樹,n個節點的二叉樹除去根節點還有n-1個節點,左子樹和右子樹一共n-1個節點,左子樹和右子樹的數量可以是(0,n-1),(1,n-2)...(n-1,0);
假設m個節點的二叉樹有f(m)種,則總共種類數=[f(0)*f(n-1)]+[f(1)*f(n-2)]+...+[f(n-1)*f(0)]
func numTrees(n int) int { dp:=make([]int,n+1) dp[0],dp[1]=1,1 for i:=2;i<=n;i++{ dp[i]=0 for j:=1;j<=i;j++{ dp[i]=dp[i]+dp[j-1]*dp[i-j] } } return dp[n] }