题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像。
思路:先前序遍历这课二叉树的每个节点,如果遍历到的节点有子节点,就交换它的两个子节点。当交换完所有非叶节点的左、右子节点之后,就得到了树的镜像。分别有递归和迭代两种解法,推荐递归解法。
核心代码如下:
struct BinaryTreeNode{
double m_nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
};
//递归解法
void MirrorRecursively(BinaryTreeNode* pNode){
if(pNode == nullptr)
return;
if(pNode->m_pLeft == nullptr && pNode->m_pRight == nullptr)
return;
BinaryTreeNode* pTemp = pNode->m_pLeft;
pNode->m_pLeft = pNode->m_pRight;
pNode->m_pRight = pTemp;
if(pNode->m_pLeft)
return MirrorRecursively(pNode->m_pLeft);
if(pNode->m_pRight)
return MirrorRecursively(pNode->m_pRight);
}
//迭代解法
void MirroeIteratively(BinaryTreeNode* pRoot){
if(pRoot == nullptr)
return;
stack<BinaryTreeNode*> stackTreeNode;
stackTreeNode.push(pRoot);
while(stackTreeNode.size() > 0){
BinaryTreeNode *pNode = stackTreeNode.top();
stackTreeNode.pop();
BinaryTreeNode *pTemp = pNode->m_pLeft;
pNode->m_pLeft = pNode->m_pRight;
pNode->m_pRight = pTemp;
if(pNode->m_pLeft)
stackTreeNode.push(pNode->m_pLeft);
if(pNode->m_pRight)
stackTreeNode.push(pNode->m_pRight);
}
}