19. 二叉樹的鏡像

題目

這裏寫圖片描述

struct BinaryTreeNode 
{
    int                    m_nValue; 
    BinaryTreeNode*        m_pLeft;  
    BinaryTreeNode*        m_pRight; 
};

解析

因爲二叉樹的存儲結構是通過鏈表存儲的。所以求二叉樹的鏡像,只需要修改每個結點的左右二叉樹指針域(交換指針)。
遞歸實現和二叉樹的遍歷順序一樣。
非遞歸實現,也和二叉樹的非遞歸實現一樣,需要維護一個棧存儲空間。

實現

void MirrorRecursively(BinaryTreeNode *pNode){  //遞歸方法
    if (pNode == NULL)
        return;
    if (pNode->m_pLeft == NULL && pNode->m_pRight == NULL)
        return;
    //交換結點的左右子樹指針
    BinaryTreeNode* tmp = pNode->m_pLeft;
    pNode->m_pLeft = pNode->m_pRight;
    pNode->m_pRight = tmp;

    //遞歸方法,求左右子樹的鏡像
    if (pNode->m_pLeft)
        MirrorRecursively(pNode->m_pLeft);
    if (pNode->m_pRight)
        MirrorRecursively(pNode->m_pRight);
}

void MirrorIteratively(BinaryTreeNode* pRoot){  //循環方法
    if (pRoot == NULL)
        return;
    std::stack<BinaryTreeNode*> stackTreeNode;
    stackTreeNode.push(pRoot); 
    while (stackTreeNode.empty() == false){   //棧不爲空
        BinaryTreeNode* pNode = stackTreeNode.top();  //取棧頂元素
        stackTreeNode.pop();

        BinaryTreeNode* tmp = pNode->m_pLeft;
        pNode->m_pLeft = pNode->m_pRight;
        pNode->m_pRight = tmp;

        if (pNode->m_pLeft)
            stackTreeNode.push(pNode->m_pLeft);
        if (pNode->m_pRight)
            stackTreeNode.push(pNode->m_pRight);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章