給定乙個整數 n,求以 1 ... n 為節點組成的二叉搜尋樹有多少種?
示例:
輸入: 3
輸出: 5
解釋:給定 n = 3, 一共有 5 種不同結構的二叉搜尋樹:
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
原題url:
這道題看到的第一眼,就和之前的格雷編碼一樣,又想用動態規劃,每次都是遍歷所有情況去檢查是否有效,但感覺時間複雜度會很高,找找看有沒有什麼更高效的做法。
n = 0,只有1種。
n = 1,也只有1種。
n = 2,有2種
1 2
\ /
2 1
n = 3,有5種
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
讓我們回想一下什麼叫二叉搜尋樹
,就是針對每個節點,其左子樹中所有節點都比它小,其右子樹中所有節點都比它大。
再想一下,如果我們針對根選中的情況下,左右子樹節點的個數其實也已經定下來了,那麼假設同樣是 3 個節點,"1、2、3"和"4、5、6"可以組成二叉搜尋樹,從數量上講是一樣的,因為大小關係沒有變。
因此,我們可以說,針對二叉搜尋樹,其不用考慮值具體是多少,只需要考慮其大小關係即可,那麼這就符合上面我所希望的場景了,下一次的運算可以利用之前的結果。
以這道題來說,其具體規律就是:
從 1 開始遍歷直至 n,以每個節點作為根節點,這樣就能計算出左右各個子樹的所有節點數。
當我們知道了個數,也就可以利用之前計算的結果,獲得左右子樹可能的情況,兩者相乘,也就是在當前根的情況,所有二叉搜尋樹的情況。
將所有根節點的總計算出的數量做累加,也就得出了當前節點數的總情況。
讓我們看看**:
class solution
result[i] = count;
}return result[n];}}
提交ok, 執行用時:0 ms
,記憶體消耗:33.2 mb
。
以上就是這道題目我的解答過程了,不知道大家是否理解了。這道題目只要利用規律,構造遞推關係,也就能解決了。
96 不同的二叉搜尋樹
給定乙個整數 n,求以 1 n 為節點組成的二叉搜尋樹有多少種?示例 輸入 3 輸出 5 解釋 給定 n 3,一共有 5 種不同結構的二叉搜尋樹 1 3 3 2 1 3 2 1 1 3 2 2 1 2 3思路 這個題目實際上是乙個數學題,設整數p組成的二叉樹共有c p 種情況。當給定乙個整數n的時候...
96 不同的二叉搜尋樹
二叉搜尋樹,又被稱為是二叉查詢樹 二叉排序樹,這種樹其左子樹所有節點的值均小於根節點的值,其右子樹所有節點的值均大於根節點的值,並且其左 右子樹均為二叉搜尋樹。空樹也是二叉搜尋樹。方法一 動態規劃法 這道題可以用動態規劃的思想去解決。由於給定的節點值為1 n,是一組從小到大順序排列的資料,其中,任意...
96 不同的二叉搜尋樹
dp i 代表有 i 個結點 1.i 時候的二叉搜尋樹種數。首先就是要考慮怎麼和之前的dp連線起來,也就是說選擇有幾種。首先可以就直接把 i 這個數放在 i 1 二叉樹的根節點,二叉搜尋樹的種數就是dp i 1 如果把 i 放在左子樹,i 1是根節點,那就有dp 1 dp i 2 左子樹 右子樹 在...