相比於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 ...