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

2021-09-24 22:00:00 字數 1494 閱讀 5643

1. 題目描述

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

二叉樹如

10

/ \

6 14

/ \ / \

4 8 12 16

轉化成雙向鍊錶 4 <----> 6 <----> 8 <----> 10 <---->12 <---->14<---->16

2.解題思路
(1)二叉搜尋樹中,每個結點都有兩個分別指向其左、右子樹的指標,左子樹結點的值總是小於父結點的值,右子樹結點的值總是大於父結點的值。

(2)雙向鍊錶中,每個結點也有兩個指標,它們分別指向前乙個結點和後乙個結點。所以這兩種資料結構的結點是一致

為了減少指標的變換次數,並讓操作更加簡單,在轉換成排序雙向鍊錶時,原先指向左子結點的指標調整為鍊錶中指向前乙個結點的指標,原先指向右子結點的指標調整為鍊錶中指向下乙個結點的指標。

鍊錶是有序的,可以借助二叉樹中序遍歷,因為中序遍歷演算法的特點就是從小到大訪問結點。當遍歷訪問到根結點時,假設根結點的左側已經處理好,只需將根結點與上次訪問的最近結點(左子樹中最大值結點)的指標連線好即可。進而更新當前鍊錶的最後乙個結點指標。同時中序遍歷過程正好是轉換成鍊錶的過程,可採用遞迴方法處理

3. **
/**

public class treenode }*/

public

class

solution

if(root.left==null&&root.right==null)

//1、將左子樹構造成雙鏈表,並返回該煉表頭結點left

treenode left=

convert

(root.left)

;//2、定位到左子樹鍊錶的最後乙個節點(左子樹最右邊的節點)

//建立乙個臨時節點p,用來遍歷找到左鍊錶的最後乙個節點(左子樹最右邊的節點),p初始化指向做左子樹的根節點,

treenode p=left;

while

(p!=null&&p.right!=null)

//3、如果左子樹煉表不為空,將當前root追加到左子樹煉表後

if(left!=null)

//4、將右子樹構造成雙鏈表,並返回該鍊錶的頭結點right

treenode right=

convert

(root.right)

;//5、如果右子樹煉表不為空,將右子樹鍊錶追加到當前root後

if(right!=null)

return left!=null?left:root;

//根據左子樹鍊錶是否為空返回整個雙向鍊錶的頭指標。

}}

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

輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。思路 將二叉搜尋樹convert為雙向鍊錶,嘗試遞迴解決。遞迴關係 當訪問到節點root時,root left與轉換後的左子樹鍊錶完成互指,root right與轉換後的右子樹鍊錶完成互...

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

題目描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。分析 遞迴 struct treenode class solution if prootoftree left null prootoftree right null 1 將...

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

輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。解題思路 類似於遞迴的中序遍歷 1.將左子樹構造成雙鏈表,並返回煉表頭節點。2.定位至左子樹雙鏈表最後乙個節點。3.如果左子樹煉表不為空的話,將當前prootoftree追加到左子樹鍊錶...