ETH官方钱包

前往
大廳
主題

LeetCode - 95. Unique Binary Search Trees II 解題心得

Not In My Back Yard | 2022-02-10 00:00:08 | 巴幣 0 | 人氣 164

題目連結:


題目意譯:
給定一整數 n,回傳所有結構相異之二元搜尋樹(Binary Search Tree,BST),其每棵都有著恰好 n 個值相異的節點且值為 1 到 n。以任意順序回傳答案。

限制:
1 ≦ n ≦ 8



範例測資:
範例 1:
輸入: n = 3
輸出: [[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]]

範例 2:
輸入: n = 1
輸出: [[1]]


解題思維:
又是一題可以展現遞迴強大之處的題目:
定義 F(x, s) 將回傳所有結構相異之二元搜尋樹其每棵都有著恰好 x 個值相異的節點且值為 s 到 x + s - 1,因此 F(x, s) 將會回傳一個包含許多樹的根節點之陣列。則可以看到我們的所求即為 F(n, 1)。

而 F(x, s) 的內容如下:
當 x = 0 時,代表我們只能生出一個「空的」樹。因此我們回傳一個只包含著一個空指標的陣列;

當 x = 1 時,代表我們只能生出一個只有一個節點(其值即為 s)的樹。因此回傳一個只包含該節點的陣列;

當 x 不為 0 或 1 時,代表我們現在有一些選擇的空間:
我們可以選擇把根節點的值設成 s 到 x + s - 1 中任意一個數字。而根據 Leetcode 上的二元搜尋樹之定義,左子樹所有數值皆小於根節點之值、右子樹所有數值皆大於根節點之值。

假設我們現在窮舉到的是數字 i,則我們讓左子樹有著 s ~ i - 1 這些值,也就是會有 i - s 個節點,因此我們呼叫 F(i - s, s) 來得到這些可能的左子樹;相同地,我們呼叫 F(x - i + s - 1, i + 1) 來得到所有可能的右子樹。

現在回到我們的根節點,而這個根節點可以從左子樹候選(假設有 L 個)中任意挑一個作為它的左子樹;同樣地也可以從右子樹候選(假設有 R 個)任意挑一個作為它的右子樹。因此我們會有 L × R 種挑法,每一種都是結構相異的二元搜尋樹,因此把這些可能的根節點集結起來即是 F(x, s) 的回傳值。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作