LeetCode 109 有序鍊錶轉換成二叉搜尋樹

2021-09-22 22:41:52 字數 1250 閱讀 2209

相比於leetcode 108 , 這道題變成了中等難度的題目, 在 107 中, 我使用的是以中心點作為分割, 然後陣列左右兩部分分別作為左子樹和右子樹去進行遞迴, 這道題我也打算使用這個思路, 步驟為:

1. 找到鍊錶的中心位置.

2. 構造子樹

3. 遞迴

問題在於如何找到鍊錶的中心節點?

leetcode 前面的有關於鍊錶的題目, 經常是會使用"快慢指標"的方法:

快指標一次步進2個節點, 慢指標一次步進1個節點,這樣當快指標到達終點的時候,慢指標所指向的節點就是中間的節點.

題目假設的是, 公升序鍊錶. 也就意味著不可能有環? 嚴格來說, 所有元素相同的情況下,構成乙個環, 也可以算是"公升序鍊錶"吧,看起來有點不嚴謹, 不過不深究了. 最好還是 快慢指標 也可以同時檢查有沒有環.

最後寫出來的演算法是這樣的

def sortedlisttobst(head: listnode): treenode =  else end = true}i

}}def buildtree(from: listnode, until: listnode): treenode = else }}

if(head == null) null

else buildtree(head, null)

}

居然沒有我大scala的語法高亮, ╭(╯^╰)╮

其中middle函式是用來計算中間節點的

buildtree函式用來進行遞迴

平常的遞迴實現的話, 我比較喜歡使用 from, to 的下標, 後者是包含在內部的, 總覺得思考起來比較方便, 但是這次的話,使用until會比較好, 因為使用 to 的話, 還需要找到上乙個節點, 這裡不方便.

雖然這個演算法可以通過, 但是不是很高效, 因為每次都要遍歷去尋找中心節點, 相當於應該遍歷 n( 1 + 1/2 + 1/4 + ...) 次(不超過2次)

但是思想卻很樸素, 遞迴思想, 不搞花裡胡哨的, 看起來還是美的呀.

LeetCode109 有序鍊錶轉換二叉搜尋樹

給定乙個單鏈表,其中的元素按公升序排序,將其轉換為高度平衡的二叉搜尋樹。本題中,乙個高度平衡二叉樹是指乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。示例 給定的有序鍊錶 10,3,0,5,9 乙個可能的答案是 0,3,9,10,null,5 它可以表示下面這個高度平衡二叉搜尋樹 0 ...

LeetCode 109 有序鍊錶轉換二叉搜尋樹

題目描述 給定乙個單鏈表,其中的元素按公升序排序,將其轉換為高度平衡的二叉搜尋樹。本題中,乙個高度平衡二叉樹是指乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。示例 給定的有序鍊錶 10,3,0,5,9 乙個可能的答案是 0,3,9,10,null,5 它可以表示下面這個高度平衡二叉搜...

leetcode109 有序鍊錶轉換二叉搜尋樹

給定乙個單鏈表,其中的元素按公升序排序,將其轉換為高度平衡的二叉搜尋樹。本題中,乙個高度平衡二叉樹是指乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。示例 給定的有序鍊錶 10,3,0,5,9 乙個可能的答案是 0,3,9,10,null,5 它可以表示下面這個高度平衡二叉搜尋樹 0 ...