1. 程式人生 > >《程式設計之美》——二叉搜尋樹轉換為排序雙向連結串列

《程式設計之美》——二叉搜尋樹轉換為排序雙向連結串列

題目:
輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換為一個排序的雙向連結串列。要求不能建立任何新的節點,只能調整樹中指標的指向。

分析與解法:
這裡寫圖片描述
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; } }