有序鍊錶轉換二叉搜尋樹

2022-03-23 16:13:36 字數 1164 閱讀 9010

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

本題中,乙個高度平衡二叉樹是指乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。

示例:給定的有序鍊錶: [-10, -3, 0, 5, 9],

乙個可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面這個高度平衡二叉搜尋樹:

0/ \

-3 9

/ /

-10 5

解法:

public

static

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;

}

view code

由於需要找中間節點,所以需要遍歷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 ...