1. 程式人生 > >程式設計師面試一百題-11-求二元查詢樹的映象

程式設計師面試一百題-11-求二元查詢樹的映象

1-題目 :
輸入一棵二元查詢樹,將該樹轉換為它的映象,即在轉換後的二元查詢樹中,左子樹的結點都大於右子樹的結點。

2-思路 :
在遍歷二元查詢樹時每訪問到一個結點,交換它的左右子樹。

3-程式碼 :

//定義二元查詢樹的結點
struct BSTreeNode
{
    int value;
    BSTreeNode *pLeft;
    BSTreeNode *pRight;
};

//遞迴實現二元查詢樹的映象
void MirrorRecursively(BSTreeNode *pNode)
{
    if (!pNode)
    {
        return;
    }
    //交換該結點的左右子樹
    BSTreeNode *pTemp = pNode->pLeft;
    pNode->pLeft = pNode->pRight;
    pNode->pRight = pTemp;

    //若該結點的左子樹不為空,則遞迴翻轉
    if (pNode->pLeft)
    {
        MirrorRecursively(pNode->pLeft);
    }
    //若該結點的右子樹不為空,則遞迴翻轉
    if (pNode->pRight)
    {
        MirrorRecursively(pNode->pRight);
    }
}

//迴圈實現二元查詢樹的映象
void MirrorIteratively(BSTreeNode *pTreeHead)
{
    if (!pTreeHead)
    {
        return;
    }
    std::stack<BSTreeNode *> stackTreeNode;
    stackTreeNode.pop();

    //當棧不為空
    while (stackTreeNode.size())
    {
        //取出棧頂的結點
        BSTreeNode *pNode = stackTreeNode.top();
        stackTreeNode.pop();

        //交換該結點的左右子樹
        BSTreeNode *pTemp = pNode->pLeft;
        pNode->pLeft = pNode->pRight;
        pNode->pRight = pTemp;

        //若該結點的左右子樹不為空,則將其壓入棧
        if (pNode->pLeft)
        {
            stackTreeNode.push(pNode->pLeft);
        }
        if (pNode->pRight)
        {
            stackTreeNode.push(pNode->pRight);
        }
    }
}