《程式設計之美》——二叉搜尋樹轉換為排序雙向連結串列
阿新 • • 發佈:2019-02-13
題目:
輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換為一個排序的雙向連結串列。要求不能建立任何新的節點,只能調整樹中指標的指向。
分析與解法:
1、由於要求連結串列是有序的,可以藉助二叉樹中序遍歷,因為中序遍歷演算法的特點就是從小到大訪問結點。當遍歷訪問到根結點時,假設根結點的左側已經處理好,只需將根結點與上次訪問的最近結點(左子樹中最大值結點)的指標連線好即可。進而更新當前連結串列的最後一個結點指標。
2、由於中序遍歷過程正好是轉換成連結串列的過程,即可採用遞迴處理。
程式碼:
class TreeNode
{
int val;
TreeNode left = null ;
TreeNode right = null;
TreeNode(int val)
{
this.val = val;
}
}
public class Solution
{
TreeNode convertNode(TreeNode pNode, TreeNode pLastNodeInList)
{
if(pNode == null)
return;
TreeNode pCurrent = pNode;
//遞迴處理左子樹
if(pCurrent.left != null )
pLastNodeInList = convertNode(pNode.left, pLastNodeInList);
//處理當前節點
//將當前節點的左指標指向已經轉換好的連結串列的最後一個位置
pCurrent.left = pLastNodeInList;
//將已經轉換好的連結串列的最後一個節點的右指標指向當前節點
if(pLastNodeInList != null)
pLastNodeInList.right = pCurrent;
//更新已經轉換好的連結串列的最後一個節點
pLastNodeInList = pCurrent;
//遞迴處理右子樹
if(pCurrent.right != null)
pLastNodeInList = convertNode(pNode.right, pLastNodeInList);
return pLastNodeInList;
}
TreeNode convert(TreeNode pRoot)
{
if(pRoot == null)
return null;
//處理二叉搜尋樹
TreeNode pLastNodeInList = null;
pLastNodeInList = convertNode(pRoot, pLastNodeInList);
//找到轉換後的連結串列的頭節點
TreeNode pHead = pLastNodeInList ;
while(pLastNodeInList != null && pLastNodeInList.left != null)
pHead = pHead.left;
//返回頭節點
return pHead;
}
}