原題目為
leetcode的
convert sorted list to binary search tree
/**樹和鍊錶的定義
* definition for singly-linked list.
* public class listnode
* }*/
/*** definition for binary tree
* public class treenode
* }*/
bst,二叉搜尋樹,小的在左邊,大的在右邊這個大家都知道- -
怎樣從乙個有序的單向鍊錶轉化為bst呢?其實挺簡單的,首先從bst原理出發
bst的根節點其實就是等於乙個有序陣列中的中間那個大兄弟
比喻,現在要轉化為bst的不是鍊錶,而是乙個有序的陣列,一共有n個數。這樣的話就更加簡單,我們來分析一下
1,首先我們通過下標找出中間的那個數作為根節點,假設下表為x
2,那麼下標0~x-1的數肯定比x小,x+1~n-1的數比x大,將其分成三段
3 新建根節點root的值為 下標x的數值,然後root的左孩子的值就是等於下標0~x-1的中間的下標的值,而右孩子就是x+1~n中間的下標的值,去到這一步大家都知道其實就是重複著1跟2,不停的遞迴下去,只要設定好遞迴的退出就能輕易轉化好這個bst
好了,回到我們的問題
單向鍊錶跟陣列轉化為bst唯一的不同就是找他的中間那個兄弟比較麻煩。
這時我們就需要動用單向鍊錶最喜歡用的快慢指標了,一快一慢,輕輕鬆鬆找到中間的
(假如不理解快慢指標的可以直接看**,然後直接畫個鍊錶出來模擬一下,一次生兩次熟)
當找到中間的大兄弟的時候,其他操作其實跟陣列沒什麼區別,下面直接貼出**。
public treenode sortedlisttobst(listnode head)
treenode sb=new treenode(man.val);
premid.next = null;
sb.left=sortedlisttobst(head);
sb.right=sortedlisttobst(man.next);
return sb;
}對於快慢指標,這個是鍊錶的乙個必須要掌握的內功心法!
必須要多練練!
將BST轉換為有序的雙向鍊錶
在二叉樹中,每個結點都有兩個指向子結點的指標.在雙向鍊錶中,每個結點也有兩個指標,它們分別指向前乙個結點和後乙個結點.由於這兩種結構的相似性,同時二叉搜尋樹也是一種排過序的資料結構,因此在理論上有可能實現二叉搜尋樹和排序的雙向鍊錶之間的轉換.下面的檔案bst to dl.cpp將bst轉換為排序過的...
將雙向鍊錶轉化為二叉堆並有序輸出
某公司的一道面試題,跪了,希望能學到東西!解決的問題是將雙向鍊錶有序輸出,直接上 不懂的可以在下面提問,有問題希望高手能提出來,或者能進行優化的,感覺在輸出的 上寫的不好,希望大牛幫忙看下。問題 將乙個雙向鍊錶有序的輸出,平均時間 複雜度為nlogn,不能退化為n方,輔助空間大小為 o 1 從上面的...
微軟面試百題001 BST轉化有序雙向鍊錶
不允許開闢新的節點,只是改變指標的轉向,將一顆標準的bst轉化為乙個雙向鍊錶,返回雙向鍊錶的頭指標 測試用例描述 75 9 28 10 3 12 1這棵二叉查詢樹轉化為雙向鍊錶的操作結果是 2 1 3 5 7 8 9 10 12 本博主的bst總結詳解 這裡我們先考慮bst 的性質,bst作為一顆高...