將單向有序鍊錶轉化為BST

2021-08-02 02:26:17 字數 1141 閱讀 4607

原題目為

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作為一顆高...