题目
struct BinaryTreeNode
{
int m_nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
};
解析
因为二叉树的存储结构是通过链表存储的。所以求二叉树的镜像,只需要修改每个结点的左右二叉树指针域(交换指针)。
递归实现和二叉树的遍历顺序一样。
非递归实现,也和二叉树的非递归实现一样,需要维护一个栈存储空间。
实现
void MirrorRecursively(BinaryTreeNode *pNode){ //递归方法
if (pNode == NULL)
return;
if (pNode->m_pLeft == NULL && pNode->m_pRight == NULL)
return;
//交换结点的左右子树指针
BinaryTreeNode* tmp = pNode->m_pLeft;
pNode->m_pLeft = pNode->m_pRight;
pNode->m_pRight = tmp;
//递归方法,求左右子树的镜像
if (pNode->m_pLeft)
MirrorRecursively(pNode->m_pLeft);
if (pNode->m_pRight)
MirrorRecursively(pNode->m_pRight);
}
void MirrorIteratively(BinaryTreeNode* pRoot){ //循环方法
if (pRoot == NULL)
return;
std::stack<BinaryTreeNode*> stackTreeNode;
stackTreeNode.push(pRoot);
while (stackTreeNode.empty() == false){ //栈不为空
BinaryTreeNode* pNode = stackTreeNode.top(); //取栈顶元素
stackTreeNode.pop();
BinaryTreeNode* tmp = pNode->m_pLeft;
pNode->m_pLeft = pNode->m_pRight;
pNode->m_pRight = tmp;
if (pNode->m_pLeft)
stackTreeNode.push(pNode->m_pLeft);
if (pNode->m_pRight)
stackTreeNode.push(pNode->m_pRight);
}
}