給定乙個單鏈表,其中的元素按公升序排序,將其轉換為高度平衡的二叉搜尋樹。
本題中,乙個高度平衡二叉樹是指乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。
示例:給定的有序鍊錶: [-10, -3, 0, 5, 9],
乙個可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面這個高度平衡二叉搜尋樹:
0/ \
-3 9
/ /
-10 5
解法:
publicview codestatic
treenode sortedlisttobst(listnode head)
/*當節點的下乙個節點為null,說明鍊錶只有乙個節點,直接返回乙個節點的值
*/if(head.next==null
)
/*鍊錶中間的節點,慢指標
*/listnode slow =head;
/*定義乙個快指標
*/listnode fast =head;
/*定義鍊錶的中間節點的前乙個節點
*/listnode pre=new listnode(0);
pre.next=head;
/*找到中間節點和中間節點的前乙個節點
*/while (fast != null && fast.next != null
)
/*把鍊錶從中間節點斷開
*/pre.next=null
;
/*中間節點為平衡樹的根節點
*/treenode result=new
treenode(slow.val);
/*從頭開始,依次把中間節點左邊的節點放入樹的左邊
*/result.left=sortedlisttobst(head);
/*依次把中間節點右邊的節點放入樹的右邊
*/result.right=sortedlisttobst(slow.next);
return
result;
}
由於需要找中間節點,所以需要遍歷n/2次,時間複雜度就是線性階o(n),此外由於需要遞迴去構造左子樹和右子數,鍊錶會被分割的越來越短,故時間複雜度是對數階o(logn),故總體時間複雜度是o(nlogn),空間複雜度是 o(logn).
有序鍊錶轉換二叉搜尋樹
題目描述 給定乙個單鏈表,其中的元素按公升序排序,將其轉換為高度平衡的二叉搜尋樹。本題中,乙個高度平衡二叉樹是指乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 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 ...