給定乙個單鏈表,其中的元素按公升序排序,將其轉換為高度平衡的二叉搜尋樹。
本題中,乙個高度平衡二叉樹是指乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。
示例:給定的有序鍊錶: [-10, -3, 0, 5, 9],
乙個可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面這個高度平衡二叉搜尋樹:
0
/ \-3 9
/ /
-10 5
解題思路:
我想到的是每一次分治,然後分支的中間節點是根節點,左右分別是左右子樹。所以重點就是要得到鍊錶的中間節點
1. 我們可以從頂向下,即直接遍歷整個鍊錶,用陣列存起來,這樣就知道每乙個中間節點
2. 可以自底向上,當我們知道鍊錶的長度之後,我們可以根據長度來遞迴,根據遞迴的特性,首先肯定是得到左子樹的連線,然後才是右子樹。
我的code:由於儲存整個陣列,空間複雜度在o(n),由於需要遍歷整個鍊錶,時間複雜度為o(n)
class
solution
int m=l+
(r-l+1)
/2; treenode* left=
null
; treenode* right=
null;if
(m-1
>=l)
left=
backthrough
(lnode,l,m-1)
;if(m+1
<=r)
right=
backthrough
(lnode,m+
1,r)
; treenode* mnode =
newtreenode
(lnode[m]
->val)
; mnode-
>left=left;
mnode-
>right=right;
return mnode;};
treenode*
sortedlisttobst
(listnode* head)
return
backthrough
(lnode,
0,lnode.
size()
-1);
}};
直接遍歷得到長度:時間複雜度就是遍歷整個鍊錶o(n),空間複雜度為遞迴的樹的高度o(logn):
var h *listnode
func
sortedlisttobst
(head *listnode)
*treenode
length :=
0 h = head
for head !=
nilreturn
buildbst(0
, length-1)
}func
buildbst
(start, end int
)*treenode
mid :=
(start + end)
>>
1 left :=
buildbst
(start, mid-1)
root :=
&treenode
h = h.next
root.left = left
root.right =
buildbst
(mid+
1, end)
return root
}
有序鍊錶轉換二叉搜尋樹
題目描述 給定乙個單鏈表,其中的元素按公升序排序,將其轉換為高度平衡的二叉搜尋樹。本題中,乙個高度平衡二叉樹是指乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。思路分析 我們可以利用兩個指標來訪問鍊錶中的中間元素。當找到鍊錶中的中間元素後,我們將鍊錶從中間元素的左側斷開,做法是使用乙個...
有序鍊錶轉換二叉搜尋樹
題目描述 給定乙個單鏈表,其中的元素按公升序排序,將其轉換為高度平衡的二叉搜尋樹。本題中,乙個高度平衡二叉樹是指乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。示例 給定的有序鍊錶 10,3,0,5,9 乙個可能的答案是 0,3,9,10,null,5 它可以表示下面這個高度平衡二叉搜...
有序鍊錶轉換二叉搜尋樹
給定乙個單鏈表,其中的元素按公升序排序,將其轉換為高度平衡的二叉搜尋樹。本題中,乙個高度平衡二叉樹是指乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。示例 給定的有序鍊錶 10,3,0,5,9 乙個可能的答案是 0,3,9,10,null,5 它可以表示下面這個高度平衡二叉搜尋樹 0 ...