給定乙個單鏈表,其中的元素按公升序排序,將其轉換為高度平衡的二叉搜尋樹。本題中,乙個高度平衡二叉樹是指乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。
示例:給定的有序鍊錶: [-10, -3, 0, 5, 9],
乙個可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面這個高度平衡二叉搜尋樹:
1、利用慢指標(一次走一步)和快指標(一次走兩步)的特點(當快指標到達尾節點或下一節點為尾節點時,慢指標剛好到達中間節點),得到中間節點;
2、將中間節點作為二叉搜尋樹的根節點構建二叉搜尋樹;
3、遞迴以上操作;
4、注意需要判斷是否存在左子樹才進行遞迴構建左子樹,因為左子樹是使用head進行構建;右子樹是使用slow.next進行構建所以可以進行判斷空值。
/**
* definition for singly-linked list.
* public class listnode
* listnode(int val)
* listnode(int val, listnode next)
* }*//**
* definition for a binary tree node.
* public class treenode
* treenode(int val)
* treenode(int val, treenode left, treenode right)
* }*/class
solution
// 慢指標
listnode slow = head;
// 塊指標
listnode fast = head;
// 慢指標的前驅節點
listnode pre = null;
// 尋找中間節點
while
(null != fast && null != fast.next)
// 建立二叉搜尋樹
treenode root =
newtreenode
(slow.val)
;// 判斷是否存在左子樹
if(null != pre)
// 遞迴構建右子樹
root.right =
sortedlisttobst
(slow.next)
;// 返回結果
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 ...