有序鍊錶轉換二叉搜尋樹(快慢指標 遞迴實現)

2021-10-24 14:21:48 字數 1335 閱讀 2345

給定乙個單鏈表,其中的元素按公升序排序,將其轉換為高度平衡的二叉搜尋樹。本題中,乙個高度平衡二叉樹是指乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 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 ...