有序鍊錶轉換二叉搜尋樹

2021-10-12 12:39:18 字數 1828 閱讀 5470

給定乙個單鏈表,其中的元素按公升序排序,將其轉換為高度平衡的二叉搜尋樹。

本題中,乙個高度平衡二叉樹是指乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 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 ...