把二叉查找樹轉變成排序的雙向鏈表

例如:
node

10
/ \
6 14
/ \ / \
4 8 12 16
轉換成雙向鏈表
4=6=8=10=12=14=16數組

struct BSTreeNode
{
int m_nValue; // value of node
BSTreeNode *m_pLeft; // left child of node
BSTreeNode *m_pRight; // right child of node
};
spa

首先闡述下二叉排序樹:
指針

它首先要是一棵二元樹,在這基礎上它或者是一棵空樹;或者是具備下列性質的二元樹: (1)若左子樹不空,則左子樹上全部結點的值均小於它的根結點的值; (2)若右子樹不空,則右子樹上全部結點的值均大於它的根結點的值; (3)左、右子樹也分別爲二元查找樹code


解決思路:排序

中序遍歷獲得的即爲排序好的鏈表順序,所以須要解決的就是指針的指向問題。class

好吧,我首先想到的不是遍歷過程當中修改指針指向(後來看別人代碼了......)基礎

最開始的思路是在中序遍歷過程當中左孩子要訪問當前節點的父節點,所以中序遍歷過程當中應當傳遞當前節點和父節點。這就致使了root(根)節點與其餘節點的處理方式不一樣。List

後來想到既然中序遍歷是一個排序好的鏈表,那麼遍歷過程當中將當前訪問節點的地址放入一個指針數組。遍歷結束後經過這個指針數組就能夠方便的知道每一個節點的前驅和後繼節點,再更改節點指向便可。遍歷

最後看到了別人的代碼,總結以下:

head指針指向鏈表表頭,index指針指向鏈表尾節點。

全部節點的左指針都指向前一節點,右指針都指向後一節點。

所以:(中間過程)

當前節點的左指針指向表尾節點;

表尾節點的右指針指向當前節點;

更新,尾節點指向當前節點;

(對於表頭,即尾節點指向NULL),初始化Head節點。

代碼以下:

void convertToDoubleList(BSTreeNode* pCurrent)
{
    pCurrent->m_pLeft=pIndex;
    if (pIndex == NULL)
    {
        pHead=pCurrent;
    }
    else
    {
        pIndex->m_pRight=pCurrent;
    }
    pIndex=pCurrent;
}

爲何我沒有想到....

o(╯□╰)o 

相關文章
相關標籤/搜索