題目
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);
}
}