劍指offer 二叉搜尋樹與雙向鍊錶

2021-09-01 20:51:15 字數 1168 閱讀 4392

輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。

有上圖的分析可以看出,通過中序遍歷的方法就可以將一棵平衡二叉樹轉為排序的雙向鍊錶(平衡二叉樹通過中序便利的方式就可以按照從小到大的順序排列,遍歷過程中改變指標指向即可。)

實現1:兩個指標,右指標不斷右移完成遍歷和指標設定

實現2:乙個指標,從中序遍歷的最後乙個節點開始向左遍歷

中序遍歷

* step1:二叉樹中,每個節點都有兩個指向子節點的指標。在雙向鍊錶中,每個節點也有兩個指標,分別指向它的前乙個和後乙個節點

* step2:由於要求轉換後的節點是排好序的,我們可以中序遍歷樹中的每乙個節點,因為中序遍歷的特點是按照從小到大的順序遍歷二叉樹中的每乙個節點。

* step3:按照中序遍歷的順序,當我們把遍歷轉換到根節點(值為10的節點)時,它的左子樹已經變成乙個排序鍊錶了,並且處在鍊錶中的最後乙個節點是當前值最大的節點。我們把值為8的節點和根節點連線起來,此時鍊錶中的最後乙個節點就是10。接著去遍歷轉換右子樹,並把根節點和右子樹最小的值連線起來。

實現3:

3.堆疊實現

利用棧實現二叉樹的中序遍歷:

用中序遍歷的方法,每遍歷到乙個節點時,將該節點儲存下來,然後在遍歷下乙個節點之前,將儲存節點的right指向下乙個節點,將下乙個節點的left指向上乙個節點,這樣就會形成乙個排序的雙向鍊錶。然後將之前指向儲存的指標指向當前這個節點.

其實是乙個treenode的遍歷,利用乙個棧來實現二叉樹的中序遍歷。

實現4:

劍指offer 二叉搜尋樹與雙向連線

題目描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。普通的二叉樹也可以轉換成雙向鍊錶,只不過不是排序的 思路 與中序遍歷相同 採用遞迴,先鏈結左指標,再鏈結右指標 1,更改doublelinkedlist,最後返回list的第乙...

《劍指offer》 二叉搜尋樹與雙向鍊錶

題目描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。解法 主要應用到二叉樹的中序遍歷。將左子樹遍歷進行不斷壓棧,然後再出棧。用兩個指標,current指向當前的樹的節點,pre指向前乙個節點,然後進行改指標引用,把壓棧的節點進行...

《劍指offer》二叉搜尋樹與雙向鍊錶

輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向 輸入一棵二叉搜尋樹 將該二叉搜尋樹轉換成乙個排序的雙向鍊錶 struct treenode class solution 按照中序遍歷,按照左子樹 根節點 右子樹的順序。include ...