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

2021-09-22 19:45:44 字數 1006 閱讀 5199

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

思路:二叉搜尋樹中,每個節點都有兩個分別指向其左右子樹的指標,左子樹的節點值總是小於父節點的值,右子樹的節點值總是大於父節點的值。

在雙向鍊錶中,每個節點也有兩個指標,它們分別指向前乙個節點和後乙個節點。

在轉換成排序雙向鍊錶時,原先指向左子節點的指標調整為鍊錶中指向前乙個節點的指標,原先指向右子節點的指標調整為鍊錶中指向下乙個節點的指標。由於鍊錶要求有序,則可借助二叉樹中序遍歷。中序遍歷演算法的特點是從小到大訪問節點。當遍歷訪問到根節點時,假設根節點的左側已經處理好,中只需將根節點與上次訪問的最近節點(左子樹最大節點)的指標連線好即可,進而更新當前鍊錶的最後乙個節點指標。同時中序遍歷過程正好是轉換成鍊錶的過程,可採用遞迴方法。

**:

/**

public class treenode }*/

public class solution

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

//將左子樹構造成雙鏈表,並返回煉表頭節點

treenode left = convert(prootoftree.left);

treenode p = left;

//定位到左子樹雙鏈表最後乙個節點

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

//如果左子樹煉表不為空的話,將當前root追加到左子樹鍊錶

if(left != null)

//將右子樹構造成雙鏈表,並返回表頭節點

treenode right = convert(prootoftree.right);

//如果右子樹煉表不為空的話,追加到root節點後

if(right != null)

return left == null ? prootoftree : left;

}}

劍指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追加到左子樹鍊錶...