以i爲根節點時,其左子樹構成爲[0,...,i-1],其右子樹構成爲[i+1,...,n]構成。根結點肯定時,左子樹與右子樹的結點個數都是肯定的。java
這樣就能夠把這個問題化成子問題。所以能夠用動態規劃解。spa
Sigma(左邊的子樹可能狀態 * 右邊子樹可能狀態) = 當前個數的結點可能的狀態數。blog
public class Solution { public int numTrees(int n) { int nums[] = new int[n+1]; if(n<=1) return 1; nums[0]=1; nums[1]=1; for(int i=2; i<=n; i++){ nums[i]=0; for(int j=0; j<i; j++){ int leftNum = nums[j]; int rightNum = nums[i-j-1]; nums[i] += leftNum * rightNum; } } return nums[n]; } }
JAVA效率就是比較低啊……300+ms。 一樣的過程用C寫就4ms。io