二叉树的镜像
题目:
请完成一个函数,输入 一个二叉树,该函数输出她的镜像。
求一棵树的镜像的过程:
先前序遍历这棵树的每个结点,如果遍历到的结点有子结点,就交换他的两个子结点,当交换完所有的非叶子节点的左右子结点之后,就
得到树的镜像。
#include<stdio.h>
#include<stdlib.h>
struct BinaryTreeNode
{
int m_nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
};
void mirrorRecursively(BinaryTreeNode* pNode)
{
if((pNode==NULL)||(pNode->m_pLeft==NULL&&pNode->m_pRight))
return ;
BinaryTreeNode* pTemp= pNode->m_pLeft;
pNode->m_pLeft=pNode->m_pRight;
pNode->m_pRight=pTemp;
if(pNode->m_pLeft)
mirrorRecursively(pNode->m_pLeft);
if(pNode->m_pRight)
mirrorRecursively(pNode->m_pRight);
}
BinaryTreeNode* createTree(BinaryTreeNode* pRoot)
{
int data;
scanf("%d",&data);
if(data!=-1)
{
pRoot=(BinaryTreeNode*)malloc(sizeof(BinaryTreeNode*));
if(pRoot==NULL)
return NULL;
pRoot->m_nValue=data;
pRoot->m_pLeft=createTree(pRoot->m_pLeft);
pRoot->m_pRight=createTree(pRoot->m_pRight);
return pRoot;
}
return NULL;
}
void printTree(BinaryTreeNode* pNode)
{
if(pNode==NULL)
return ;
printf("%d\n",pNode->m_nValue);
printTree(pNode->m_pLeft);
printTree(pNode->m_pRight);
}
int main()
{
BinaryTreeNode* pRoot;
BinaryTreeNode* pNode=createTree(pRoot);
mirrorRecursively(pNode);
printTree(pNode);
return 0;
}
结果: