原题参见july大神博客系列【微软面试100题】
题目描述:输入一个二叉树,输出其镜像。
分析思路:(本题亦见于《剑指offer》面试题19)
先前序遍历树的每个结点,如果其有子结点,就交换之。当交换完所有非叶子结点的左右子结点后,就得到了镜像
代码如下:
void MirrorRecursively(TreeNode* pNode)
{
if(pNode == NULL)
return;
if(pNode->m_pLeft == NULL && pNode->m_pRight)
return;
TreeNode* pTemp = pNode->m_pLeft;
pNode->m_pLeft = pNode->m_pRight;
pNode->m_pLeft = pTemp;
if(pNode->m_pLeft != NULL)
MirrorRecursively(pNode->m_pLeft);
if(pNode->m_pRight != NULL)
MirrorRecursively(pNode->m_pRight);
}
上述代码使用递归实现,由于递归的本质就是栈,如果要使用迭代实现,就得用到栈。代码如下:
void MirrorIteratively(TreeNode* pRoot)
{
if(pNode == NULL)
return;
stack<TreeNode *> buf;
buf.push(pRoot);
while (!buf.empty())
{
Node* currentNode = buf.top();
Node* pTemp = currentNode->m_pLeft;
currentNode->m_pLeft = currentNode->m_pRight;
currentNode->m_pRight = pTemp;
buf.pop();
if(currentNode->m_pLeft != NULL) buf.push(currentNode->m_pLeft);
if(currentNode->m_pRight != NULL) buf.push(currentNode->m_pRight);
}
}