关于二叉树定义可参考:C++笔试题之求完全二叉树叶子节点数_叶结点数量等于n/2-CSDN博客
题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像。
二叉树结点的定义如下:
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);
}
}
原文链接:C++笔试题之二叉树的镜像-CSDN博客