數據結構-劍指offer-二叉搜索樹與雙向鏈表

題目:輸入一棵二叉搜索樹,將該二叉搜索樹轉換成一個排序的雙向鏈表。要求不能創建任何新的結點,只能調整樹中結點指針的指向。

思路:中序遍歷二叉搜索樹,得到的序列就是有序的。如果沒有後面的要求,就可以先通過前序遍歷得到一個方向的鏈表,再新建節點,實現雙向鏈表。在搜索二叉樹中,左子節點的值總是小於父節點的值,右子節點的值總是大於父節點的值

劍指offer的思路:在將二叉搜索樹轉換成排序雙向鏈表時,原先指向左子節點的指針調整爲鏈表中指向前一個節點的指針,原先指向右子節點的指針調整爲鏈表中指向後一個節點的指針。可以把二叉搜索樹分爲三部分,根節點的左子樹,根節點,根節點的右子樹。左子樹右子樹的遍歷轉換過程是一樣的,得到的直接就是排好序的序列,根節點有所不同。使用遞歸的方法。但劍指書中提供的代碼包括很多指針和指向指針的指針,閱讀起來很繁瑣。

這個題的思路可以理解,但編碼沒怎麼看懂。討論區的遞歸方法、、、唉

class Solution {
public:
    TreeNode* Convert(TreeNode* pRootOfTree)
    {
        TreeNode* pLast = nullptr;
        ConverNode(pRootOfTree,&pLast);
        TreeNode* pHead = pLast;
        while(pHead != nullptr && pHead->left != nullptr)
            pHead = pHead->left;
        return pHead;
    }
    void ConverNode(TreeNode* pNode,TreeNode** pLast){
        if(pNode == nullptr)
            return;
        TreeNode* pCurrent = pNode;
        if(pCurrent->left != nullptr)
            ConverNode(pCurrent->left,pLast);
        pCurrent->left = *pLast;
        if(*pLast != nullptr)
            (*pLast)->right = pCurrent;
        *pLast = pCurrent;
        if(pCurrent->right != nullptr)
            ConverNode(pCurrent->right,pLast);
    }
};
思路二(討論區的大神)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章