給定乙個單鏈表,其中的元素按公升序排序,將其轉換為高度平衡的二叉搜尋樹。
本題中,乙個高度平衡二叉樹是指乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。
示例:給定的有序鍊錶: [-10, -3, 0, 5, 9],
乙個可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面這個高度平衡二叉搜尋樹:
0
/ \-3 9
/ /
-10
對於這類問題,基本上最容易想到的就是分治。因為有序鍊錶和搜尋二叉樹有如下特性
結合以上三點,容易聯想到獲取鍊錶的中位數的值,作為二叉樹的根節點,然後依次遞迴構造左右子樹的方法。難點在於如何尋找單鏈表的中位數和如何判斷遞迴的終止條件。
尋找單鏈表的中位值不可如同陣列索引一般的直接可以查詢到中位值,可以通過快慢指標的方式獲取。
遞迴的終止條件應該是左節點等於右節點,分治的區間是左閉右開
class solution
public treenode buildtree(listnode left, listnode right)
listnode mid = getmedian(left, right);
treenode root = new treenode(mid.val);
root.left = buildtree(left, mid);
root.right = buildtree(mid.next, right);
return root;
}public listnode getmedian(listnode left, listnode right)
return slow;
}}
將二叉搜尋樹轉化成有序的雙向鍊錶
問題描述 輸入乙個二叉搜尋樹,將該二叉樹轉化成乙個排序的雙向鍊錶。要求不能建立任何新的節點,只能夠調整樹中節點指標的指向。二叉樹的節點定義如下 struct node 由於該樹是二叉排序樹,所以每個根節點的左指標指向的是其左子樹的最右下角的節點,右指標指向的應當是其右子樹的最左下的節點。基於以上結論...
二叉搜尋樹轉化成雙向鍊錶
輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。其中乙個測試用例 按層序遍歷輸入 對應輸出應該為 from left to right are 4,6,8,10,12,14,16 from right to left are 16,1...
怎樣把二叉搜尋樹轉化成排序雙向鍊錶?
一 首先介紹二叉搜尋樹 概念 二叉搜尋樹是指在一顆二叉樹上,這顆二叉樹上的每個節點都有 所有左節點 該節點 所有右節點 例如下樹 二 根據搜尋二叉樹特性分析 因為二叉樹的實現也是靠指標實現的,所以其資料結構和雙向鍊錶的結構是相同的 若把箭頭話上,就變成了這樣子。注 紅色代表指向空 所以根據特性,我們...