【问题描述】编写递归算法,将二叉树中所有节点的左、右子树相互交换。
【输入形式】按先序序列输入二叉树各结点的值,结点的值是单字符,空子树输入空格。
【输出形式】先输出交换后的二叉树的先序序列,再输出中序序列。
【样例输入】例如三个的满二叉树,输入:a,b, , ,c, , (b后有两个空格,表示b有两棵子树;c后有两个空格)
【样例输出】上面的满二叉树交换后的输出:
acb //先序序列
cab //中序序列
【样例说明】
【评分标准】
对于这种带空格的输入就很狗了,太刁钻了吧,我们只好放弃cin>>,拿起scanf(不要忘了头文件)
a,b, , ,c, , (b后有两个空格,表示b有两棵子树;c后有两个空格) 空格表示空子树
char n;
scanf("%c,",&n);
if (n == ' ')
T = NULL;
注意scanf “%c,” 将,逗号放入已知格式中,在取址输入字符(会是空格)
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<stdio.h>
using namespace std;
typedef struct tree
{
char val;
struct tree *lc, *rc;
}BiNode,*BiTree;
void Creat(BiTree &T)
{
char n;
scanf("%c,",&n); //注意此处的输入方式
if (n == ' ') //输入空格 为空子树
T = NULL;
else
{
T = new BiNode;
T->val = n;
Creat(T->lc);
Creat(T->rc);
}
}
BiTree t;
void Exc(BiTree &T)
{
if (T)
{
t = T->lc;
T->lc = T->rc;
T->rc = t;
Exc(T->lc);
Exc(T->rc);
}
}
void Preorder(BiTree &T)
{
if (T)
{
cout << T->val;
Preorder(T->lc);
Preorder(T->rc);
}
}
void Midorder(BiTree &T)
{
if (T)
{
Midorder(T->lc);
cout << T->val;
Midorder(T->rc);
}
}
int main()
{
BiTree T;
Creat(T);
Exc(T);
Preorder(T);
cout << '\n';
Midorder(T);
return 0;
}