题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像。
二叉树节点定义如下:
1 strcut BinaryTreeNode 2 { 3 int val; 4 strcut BinaryTreeNode* m_pleft; 5 strcut BinaryTreeNode* m_pright; 6 }
本题可以参考http://www.cnblogs.com/vpoet/p/4660486.html(Leecode-Invert Binary Tree)一文
实质是递归交换二叉树的左右节点。
比如
1 8 2 / 3 6 10 4 / / 5 5 7 9 11
1.首先查看根节点与左右子节点是否为空,若为空则无需交换
2.先交换根节点的左右子节点。
3.再交换交换后的左子树的左右节点和右子树的左右节点
4.知道到达叶子节点,交换结束。
递归函数如下:
1 void MirrorRecursively(BinaryTreeNode *pNode) 2 { 3 if(pNode==NULL) 4 return NULL; 5 6 if(pNode->m_pleft==NULL&&pNode->m_pright==NULL) 7 return NULL; 8 9 struct BinaryTreeNode *TempNode; 10 TempNode=pNode->m_pleft; 11 pNode->m_pleft=pNode->m_pright; 12 pNode->m_pright=TempNode; 13 14 if(pNode->m_pleft) 15 { 16 MirrorRecursively(pNode->m_pleft); 17 } 18 19 if(pNode->m_pright) 20 { 21 MirrorRecursively(pNode->m_pright); 22 } 23 }
说明:注意结束条件,到达叶子结点结束
1 if(pNode->m_pleft==NULL&&pNode->m_pright==NULL) 2 7 return NULL;