7-8 交换二叉树中每个结点的左孩子和右孩子 (30 分)
以二叉链表作为二叉树的存储结构,交换二叉树中每个结点的左孩子和右孩子。
输入格式:
输入二叉树的先序序列。
提示:一棵二叉树的先序序列是一个字符串,若字符是‘#’,表示该二叉树是空树,否则该字符是相应结点的数据元素。
输出格式:
输出有两行:
第一行是原二叉树的中序遍历序列;
第二行是交换后的二叉树的中序遍历序列。
输入样例:
ABC##DE#G##F###
输出样例:
CBEGDFA
AFDGEBC
【题目含义】
【思路】四步骤
1.依据题目条件创建先序树
2.将先序转变为中序树
3.左右孩子结点的交换
4.换行输出
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
char data;
struct Node *left, *right;
} Node, *Tree;
Tree create() {
char ch;
Tree tree = NULL;
if (scanf("%c", &ch)) {//当有输入时
if (ch != '#') {
tree = (Tree)malloc(sizeof(Node));
tree->data = ch;
tree->left = create();
tree->right = create();
} else {
tree = NULL;
}
}
return tree;
}
void order(Tree tree) {
if (!tree)
return;
order(tree->left);
printf("%c", tree->data);
order(tree->right);
}
void swap(Tree tree) {
if (!tree)
return;
if (!tree->left && !tree->right)
return;
Tree tmp = tree->left;
tree->left = tree->right;
tree->right = tmp;
swap(tree->left);
swap(tree->right);
}
int main()
{
Tree tree=create();
order(tree);
printf("\n");
swap(tree);
order(tree);
return 0;
}