东锦资源再生施文东:交换二叉树所有节点的左右子树
来源:百度文库 编辑:中财网 时间:2024/04/27 22:57:50
//实验题目:已知二叉树以二叉链表作为存储结构,写一个算法来交换二叉树的所有节点的左右子树
//先建立二叉树的二叉链表存储结构,再完成算法,注意结果的输出形式
#include
#include
#include
#define STACK_INIT_SIZE 100;
#define STACKINCREMENT 10;
//定义二叉树数据类型
typedef char TElemtype;
typedef struct BiTNode
{
TElemtype data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//-------二叉树基本操作-------
//初始化二叉树
bool InitBiTree(BiTree &T)
{
T=(BiTree)malloc(sizeof(BiTNode));
T->data=NULL;
T->lchild=NULL;
T->rchild=NULL;
return true;
}
//创建二叉树
void CreateBiTree(BiTree &T)
{
TElemtype c=' ';
c=getchar();
getchar();
if(c==' ')
{
T=NULL;
}
else
{
InitBiTree(T);
T->data=c;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
//操作函数---输出
bool Visit(TElemtype e)
{
if(e!=NULL)
{
printf("%c ",e);
return true;
}
else
{
return false;
}
}
//先序遍历二叉树
bool PreOrderTraverse(BiTree T,bool Visit(TElemtype))
{
if(T)
{
if(Visit(T->data))
{
if (PreOrderTraverse(T->lchild,Visit))
{
if (PreOrderTraverse(T->rchild,Visit))
{
return true;
}
}
}
return false;
}
else
{
return true;
}
}
//----------------------------
//定义栈的数据类型
typedef struct
{
TElemtype *base;
TElemtype *top;
int stacksize;
}SqStack;
//交换左右子树
void exchange(BiTree &rt){
BiTree temp = NULL;
if(rt->lchild == NULL && rt->rchild == NULL)
return;
else{
temp = rt->lchild;
rt->lchild = rt->rchild;
rt->rchild = temp;
}
if(rt->lchild)
exchange(rt->lchild);
if(rt->rchild)
exchange(rt->rchild);
}
//-------Main函数----
void main()
{
BiTree T;
MessageBox(NULL,"请按照先序遍历输入二叉树!","提示",MB_OK|MB_ICONWARNING);
MessageBox(NULL,"请输入数据!(空格表示结束)","提示",MB_OK|MB_ICONWARNING);
CreateBiTree(T);
MessageBox(NULL,"输入结束!","提示",MB_OK|MB_ICONWARNING);
printf("\n按先序输出\n");
PreOrderTraverse(T,Visit);
MessageBox(NULL,"输出结束!","提示",MB_OK|MB_ICONWARNING);
printf("\n交换后\n");
exchange(T);
PreOrderTraverse(T,Visit);
}