1.题目描述:
请完成一个函数,输入一个二叉树,该函数输出它的镜像。二叉树结点的定义如下:
struct BinaryTreeNode
{
int m_nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
};
2.分析:
求一棵二叉树的镜像的过程为:我们先前序遍历这棵树的每个结点,如果遍历到的结点有子结点,就交换它的两个子结点。当交换完所有非叶子结点的左右结点之后,就得到了树的镜像。
3.源代码:
typedef struct BinaryTreeNode
{
char m_nValue;
struct BinaryTreeNode* m_pLeft;
struct BinaryTreeNode* m_pRight;
}*BinaryTree;
void CreateTree(BinaryTree &T)
{
char data;
cin>>data;
if(data=='*')
T=NULL;
else
{
T = (BinaryTree)malloc(sizeof(BinaryTreeNode));
T->m_nValue = data;
CreateTree(T->m_pLeft);
CreateTree(T->m_pRight);
}
}
void Print(BinaryTree T)
{
if(T)
{
cout<<T->m_nValue<<endl;
Print(T->m_pLeft);
Print(T->m_pRight);
}
}
void MirrorRecursively(BinaryTreeNode *pNode){
if(pNode == NULL)
return;
if(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)
MirrorRecursively(pNode->m_pLeft);
if(pNode->m_pRight)
MirrorRecursively(pNode->m_pRight);
}
int main(int argc,char *argv[]){
BinaryTree T1;
cout<<"以先序遍历的顺序创建的二叉树T1:"<<endl;
CreateTree(T1);
cout<<"原始的二叉树T1的先序遍历序列为:"<<endl;
Print(T1);
MirrorRecursively(T1);
cout<<"旋转后的二叉树T2的先序遍历序列为:"<<endl;
Print(T1);
return 0;
}
4.运行过程:
以先序遍历的顺序创建的二叉树T1:
124**5**3**
原始的二叉树T1的先序遍历序列为:
1
2
4
5
3
旋转后的二叉树T2的先序遍历序列为:
1
3
2
5
4
Program ended with exit code: 0