#include  <stdio.h>
#include  <stdlib.h>
#include <malloc.h>

typedef  struct  BTNode {
	char  data  ;
	struct  BTNode  *lchild;
	struct  BTNode  *rchild  ;
} *BiTree;

void  createBiTree(BiTree  *t) {
//此处补充代码,输入二叉树的先序遍历序列建立二叉树
	char s;
	BiTree q;
	s = getchar();
	getchar();
	if (s == '#') {
		*t = NULL;
		return ;
	}
	q = (BiTree)malloc(sizeof(struct BTNode));
	q->data = s;
	*t = q;
	createBiTree(&q->lchild);
	createBiTree(&q->rchild);

}

//此处补充代码,定义函数,交换二叉树结点的左右孩子
void swapChildren(BiTree p) {
	if (p) {
		BiTree temp = p->lchild;
		p->lchild = p->rchild;
		p->rchild = temp;
		swapChildren(p->lchild);
		swapChildren(p->rchild);
	}
}



void  PreOrder(BiTree  p) {
	//此处补充代码完成二叉树的先序遍历
	if (p) {
		printf("%c", p->data);
		PreOrder(p->lchild);
		PreOrder(p->rchild);
	}

}

void  InOrder(BiTree  p) {
//此处补充代码完成二叉树的中序遍历
	if (p) {
		InOrder(p->lchild);
		printf("%c", p->data);
		InOrder(p->rchild);
	}

}

void  PostOrder(BiTree  p) {
//此处补充代码完成二叉树的后序遍历
	if (p) {
		PostOrder(p->lchild);
		PostOrder(p->rchild);
		printf("%c", p->data);
	}


}

int  main() {
	//此处补充代码,调用函数完成原二叉树的三种遍历序列及交换左右孩子后的三种遍历序列
	BiTree t = NULL;
	createBiTree(&t);

	printf("preorder:");
	PreOrder(t);
	printf("\n");
	printf("inorder:");
	InOrder(t);
	printf("\n");
	printf("postorder:");
	PostOrder(t);
	printf("\n");
	printf("After swap:");
	swapChildren(t);
	printf("\n");
	printf("preorder:");
	PreOrder(t);
	printf("\n");
	printf("inorder:");
	InOrder(t);
	printf("\n");
	printf("postorder:");
	PostOrder(t);
	printf("\n");

	return  0;
}