题目:
完成一个函数,输入一个二叉树,该函数输出它的镜像。
基本思想:
先前序遍历这棵树的每个节点,如果遍历到的节点有子节点,就交换它的两个子节点,当交换完所有的非叶子节点的左右子节点之后,就得到了树的镜像。
#include <iostream>
#include <deque>
using namespace std;
//二叉树结点定义
typedef struct BiTreeNode{
int data;
//左右孩子指针
struct BiTreeNode *lchild;
struct BiTreeNode *rchild;
}BiTreeNode,*BiTree;
//按先序序列创建二叉树
int CreateBiTree(BiTree &T)
{
int data;
//按先序次序输入二叉树中结点的值(一个字符),‘#’表示空树
cin>>data;
if(data == -1)
{
T = NULL;
}
else
{
T = (BiTree)malloc(sizeof(BiTreeNode));
T->data = data;//生成根结点
CreateBiTree(T->lchild);//构造左子树
CreateBiTree(T->rchild);//构造右子树
}
return 0;
}
void foo(BiTree T)
{
if(T==NULL)
return;
if(T->lchild==NULL && T->rchild==NULL)
return;
BiTree Tmp = T->lchild;
T->lchild=T->rchild;
T->rchild=Tmp;
if(T->lchild)
foo(T->lchild);
if(T->rchild)
foo(T->rchild);
}
//访问函数
void Visit(BiTree T)
{
if(T->data != -1)
cout<<T->data<<" ";
}
//先序遍历
void PreOrder(BiTree T)
{
if(T != NULL)
{
//访问根节点
Visit(T);
//访问左子结点
PreOrder(T->lchild);
//访问右子结点
PreOrder(T->rchild);
}
}
void main()
{
BiTree T;
CreateBiTree(T);
cout<<"原二叉树为:";
PreOrder(T);
cout<<endl;
foo(T);
cout<<"镜像二叉树为:";
PreOrder(T);
cout<<endl;
}