面試題19:二叉樹的鏡像(來自《劍指Offer》)
題目:請完成一個函數,輸入一個二叉樹,該函數輸出它的鏡像。
二叉樹結點的定義如下:
struct BinaryTreeNode
{
int data;
BinaryTreeNode *Left;
BinaryTreeNode *Right;
};
通過畫圖,可知二叉樹的鏡像如下圖所示:
根據畫圖可得到這樣的思路:先序遍歷樹的每個結點,若遍歷到的結點有子結點,則交換它的兩個子結點。
有兩種實現方法:
1.遞歸實現
void MirroRecursively(BinaryTreeNode *pNode)
{
if(NULL == pNode)
return;
if(NULL == pNode->Left && NULL == pNode->Right)
return;
BinaryTreeNode *pTemp = pNode->Left;
pNode->Left = pNode->Right;
pNode->Right = pTemp;
if(pNode->Left)
MirroRecursively(pNode->Left);
if(pNode->Right)
MirroRecursively(pNode->Right);
}
2.非遞歸實現,即使用循環實現
void MirrorNonRecurively(BinaryTreeNode *pNode)
{
if(NULL == pNode)
return;
stack<BinaryTreeNode *> stackTreeNode;
stackTreeNode.push(pNode);
while(stackTreeNode.size())
{
BinaryTreeNode *pNode = stackTreeNode.top();
stackTreeNode.pop();
if(NULL != pNode->Left || NULL != pNode->Right)
{
BinaryTreeNode *pTemp = pNode->Left;
pNode->Left = pNode->Right;
pNode->Right = pTemp;
}
if(NULL != pNode->Left)
stackTreeNode.push(pNode->Left);
if(NULL != pNode->Right)
stackTreeNode.push(pNode->Right);
}
}