请完成一个函数,输入一个二叉树,该函数输出它的镜像
思路:先前序遍历这棵树的每个节点,如果遍历到的节点有子节点,就交换它的俩个子节点。当交换完所有非叶子节点的左右子节点之后,就得到了树的镜像
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
struct BinaryTree
{
int m_value;
struct BinaryTree* leftChild;
struct BinaryTree* rightChild;
};
//index 设置为&类型 则此函数调用后index会发生改变
BinaryTree* createTree(BinaryTree* root,int* s,int& index)
{
if(s[index]==0) //如果第一个是0则代表为空
return NULL;
root=new BinaryTree;
root->m_value=s[index];
root->leftChild=createTree(root->leftChild,s,++index);
root->rightChild=createTree(root->rightChild,s,++index);
return root;
}
//前序遍历
void preTraverse(BinaryTree* root)
{
if(root==NULL)
return;
cout<<root->m_value<<endl;
preTraverse(root->leftChild);
preTraverse(root->rightChild);
}
//镜像化
void MirrorRecursively(BinaryTree* root)
{
if(root==NULL)
return ;
if(root->leftChild==NULL && root->rightChild==NULL) //root的左右子节点都是NULL的话不交换
return ;
if(root->leftChild==NULL)
{
root->leftChild=root->rightChild;
root->rightChild=NULL;
}
else if(root->rightChild==NULL)
{
root->rightChild=root->leftChild;
root->leftChild=NULL;
}
else
{
BinaryTree* tmp=root->leftChild;
root->leftChild=root->rightChild;
root->rightChild=tmp;
}
MirrorRecursively(root->leftChild);
MirrorRecursively(root->rightChild);
}
int main()
{
//输入的时候,不能忘记用0来补充NULL值
int Tree[]={8,6,5,0,0,7,0,0,10,9,0,0,11,0,0};
int index=0;
BinaryTree* root=NULL;
root=createTree(root,Tree,index);
preTraverse(root);
cout<<"----"<<endl;
MirrorRecursively(root);
preTraverse(root);
return 0;
}