面试题19:二叉树的镜像
1.题目描述
题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像。二叉树结点的定义如下:
struct BinaryTreeNode
{
int m_nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
};
2.题目分析
为了能够形成直观的印象,我们可以自己画一棵二叉树,然后根据照镜子的经验画出它的镜像。如下图中右边的二叉树就是左边的
树的镜像。
这两棵树的根结点相同,但它们的左右两个子结点交换了位置。因此我们不妨先在树中交换根结点的两个子结点,就得到下图中的第二棵树。交换根结点的两个子结点之后,我们注意到值为10、6的结点的子结点仍然保持不变,因此我们还需要交换这两个结点的左右子结点。交换之后的结果分别是下图中的第三棵树和第四棵树。做完这两次交换之后,我们已经遍历完所有的非叶子结点。此时变换之后的树刚好就是原始树的镜像。
总结上面的过程,我们得出求一棵树的镜像的过程:我们先前序遍历这棵树的每个结点,如果遍历到的结点有子结点,就交换它的两个子结点。当交换完所有非叶子结点的左右子结点之后,就得到了树的镜像。
也可以用队列来实现。
3.code
void MirrorRecsively(BinaryTreeNode* pNode)
{
if((pNode == NULL) || (pNode->m_pLeft == NULL && pNode->m_pRight == NULL)) return ;
BinaryTreeNode* pTemp = pNode->m_pLeft;
pNode->m_pLeft == pNode->m_pRight;
pNode->m_pRight = pTemp;
if(pNode->m_pLeft)
{
MirrorRecsively(pNode->m_pLeft);
}
if(pNode->m_pRight)
{
MirrorRecsively(pNode->m_pRight);
}
}