不同的二叉查詢樹i:
題目內容:
給出 n,問由 1...n 為節點組成的不同的二叉查詢樹有多少種?
樣例:給出n = 3,有5種不同形態的二叉查詢樹:
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
演算法分析:
先來看一下二叉查詢樹的特點,當選定乙個節點i作為中間節點時:
①位於該節點左子樹中的所有節點均小於i,假設該節點的左子樹的排列情況有m種;
②位於該節點右子樹中的所有節點均大於i,假設該節點的右子樹的排列情況有n種;
③綜合①和②,當節點i作為當前二叉查詢樹的首節點時,該二叉查詢樹的總排列數目有m*n;
因此對於乙個擁有n個節點的二叉查詢樹,其每乙個節點均能成為某一二叉查詢樹的首節點,因此動態規劃的表示式為:
dp[i] = sum,其中1=< j <=i,dp[i]表示i個節點所能組成的二叉查詢樹的數目;
**:
publicint numtrees(int
n) }
return
result[n];
}
不同的二叉查詢樹ii:
題目內容:
給出n,生成所有由1...n為節點組成的不同的二叉查詢樹;
樣例:給出n = 3,有5種不同形態的二叉查詢樹:
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
演算法分析:
本題在 i 的基礎上要求返回的不是組數而是具體的組合,很明顯本題需要用遞迴的方式來解決問題,和 i 的思想基本一致,在遞迴的過程中找出所有的左右子樹的排列組合,然後分別連線到當前節點的左子樹和右子樹,將結果作為當前層的二叉查詢樹的所有排列組合進行返回。
**:
hashmap> map = new hashmap<>();public listfindsolution(int begin, int
end)
if(begin==end)
string tag = string.valueof(begin)+"-"+string.valueof(end);
if(map.get(tag)!=null
)
for(int i=begin;i<=end;i++)}}
if(left.size()!=0&&right.size()==0)
}if(left.size()==0&&right.size()!=0)}}
map.put(tag,result);
return
result;
}public listgeneratetrees(int
n)
**中我還建立了乙個map作為中間結果的記錄,用來降低一些重複區間段求解的時間開銷,其效果還是很明顯的,當n=11時,沒有map的演算法時間開銷為124313992ns,而有map的演算法時間開銷為82106610ns;但是這題我我試了下即使不用map也能夠ac;
LintCode 不同的二叉查詢樹
給出 n,問由 1 n 為節點組成的不同的二叉查詢樹有多少種?給出n 3,有5種不同形態的二叉查詢樹 1 3 3 2 1 3 2 1 1 3 2 2 1 2 3solution 對於該問題我們可以使用動態規劃來求解。對於動態規劃問題我們需要確定問題的狀態和狀態轉換方程。首先我們來確定問題的狀態 給定...
每日刷題 不同的二叉搜尋樹II
給定乙個整數 n,生成所有由 1 n 為節點所組成的二叉搜尋樹。示例 輸入 3 輸出 1,null,3,2 3,2,null,1 3,1,null,null,2 2,1,3 1,null,2,null,3 解釋 以上的輸出對應以下 5 種不同結構的二叉搜尋樹 1 3 3 2 1 3 2 1 1 3 ...
lintcode 不同的二叉樹II
解法思路 要生成所有情況的二叉樹,首先肯定能想到遍歷所有的數作為頭結點的情況,構建頭結點的左右子樹的過程可以利用遞迴完成。此處難點應該在於 1 同乙個數作為頭結點時,子樹可以有不同的結構 2 當前樹已經構造完成,應該將頭結點加入到結果vector中。此處的解決辦法 遞迴的正常解法,從上往下遞迴,從下...