7-4 交换二叉树中每个结点的左孩子和右孩子 (20分)

以二叉链表作为二叉树的存储结构,交换二叉树中每个结点的左孩子和右孩子。

输入格式:

输入二叉树的先序序列。

提示:一棵二叉树的先序序列是一个字符串,若字符是‘#’,表示该二叉树是空树,否则该字符是相应结点的数据元素。

输出格式:

输出有两行:

第一行是原二叉树的中序遍历序列;

第二行是交换后的二叉树的中序遍历序列。

输入样例:

ABC##DE#G##F###

输出样例:

CBEGDFA

AFDGEBC

需要三个函数:根据前序输入生成树,交换,中序输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

//根据有#的前序遍历生成树
tree fcreate()
{
tree t;
char s;
//按每个字符输入
scanf("%c",&s);
if(s=='#')return nullptr;
else {
t=(tree)malloc(sizeof(struct treenode));
t->data = s;
t->lchild = fcreate();
t->rchild = fcreate();
return t;
}
}
void Inordertranverse(tree t)
{
if(!t)return;
Inordertranverse(t->lchild);
cout<<t->data;
Inordertranverse(t->rchild);
}

//交换每个结点左右子树
void Exchange(tree &bt)
{
tree temp;
if(bt){
temp = bt -> lchild;
bt -> lchild = bt -> rchild;
bt -> rchild = temp;
Exchange(bt -> lchild);
Exchange(bt -> rchild);
}
}
int main()
{
tree t;
t=fcreate();
Inordertranverse(t);
Exchange(t);
Inordertranverse(t);
}