题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像。
二叉树结点的定义如下:
- 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);
- }
- }