1. 程式人生 > >將二叉樹轉化為雙向連結串列

將二叉樹轉化為雙向連結串列

遞迴解法:
(1)如果二叉樹查詢樹為空,不需要轉換,對應雙向連結串列的第一個節點是NULL,最後一個節點是NULL
(2)如果二叉查詢樹不為空:

如果左子樹為空,對應雙向有序連結串列的第一個節點是根節點,左邊不需要其他操作;
如果左子樹不為空,轉換左子樹,二叉查詢樹對應雙向有序連結串列的第一個節點就是左子樹轉換後雙向有序連結串列的第一個節點,同時將根節點和左子樹轉換後的雙向有序鏈 表的最後一個節點連線;
如果右子樹為空,對應雙向有序連結串列的最後一個節點是根節點,右邊不需要其他操作;
如果右子樹不為空,對應雙向有序連結串列的最後一個節點就是右子樹轉換後雙向有序連結串列的最後一個節點,同時將根節點和右子樹轉換後的雙向有序連結串列的第一個節點連 接。

參考程式碼如下:

    /****************************************************************************** 
    引數: 
    pRoot: 二叉查詢樹根節點指標 
    pFirstNode: 轉換後雙向有序連結串列的第一個節點指標 
    pLastNode: 轉換後雙向有序連結串列的最後一個節點指標 
    ******************************************************************************/  
    void Convert(BinaryTreeNode * pRoot,   
                 BinaryTreeNode * & pFirstNode, BinaryTreeNode * & pLastNode)  
    {  
        BinaryTreeNode *pFirstLeft, *pLastLeft, * pFirstRight, *pLastRight;  
        if(pRoot == NULL)   
        {  
            pFirstNode = NULL;  
            pLastNode = NULL;  
            return;  
        }  
      
        if(pRoot->m_pLeft == NULL)  
        {  
            // 如果左子樹為空,對應雙向有序連結串列的第一個節點是根節點  
            pFirstNode = pRoot;  
        }  
        else  
        {  
            Convert(pRoot->m_pLeft, pFirstLeft, pLastLeft);  
            // 二叉查詢樹對應雙向有序連結串列的第一個節點就是左子樹轉換後雙向有序連結串列的第一個節點  
            pFirstNode = pFirstLeft;  
            // 將根節點和左子樹轉換後的雙向有序連結串列的最後一個節點連線  
            pRoot->m_pLeft = pLastLeft;  
            pLastLeft->m_pRight = pRoot;  
        }  
      
        if(pRoot->m_pRight == NULL)  
        {  
            // 對應雙向有序連結串列的最後一個節點是根節點  
            pLastNode = pRoot;  
        }  
        else  
        {  
            Convert(pRoot->m_pRight, pFirstRight, pLastRight);  
            // 對應雙向有序連結串列的最後一個節點就是右子樹轉換後雙向有序連結串列的最後一個節點  
            pLastNode = pLastRight;  
            // 將根節點和右子樹轉換後的雙向有序連結串列的第一個節點連線  
            pRoot->m_pRight = pFirstRight;  
            pFirstRight->m_pRight = pRoot;  
        }  
      
        return;  
    }