【问题描述】
给出一个按照“扩展遍历序列”的扩展先序遍历序列字符串,'.' 代表空的子节点,大写字母代表节点内容。请通过这个字符串建立二叉树,并分别采用“递归”的先序、中序、后序遍历算法输出该树的每个非空节点构成的序列。
【提示】利用全局变量char *cp,让它始终指向串S中当前读取的字符ch
【输入形式】
输入只有1行 (以回车结束),包含一个字符串S,用来建立二叉树。保证S为合法的二叉树扩展先序遍历字符串,节点内容只有大写字母,且S的长度不超过80。
【输出形式】
共有3行,每一行包含一串字符,表示分别按递归的先序、中序、后序遍历得出的节点序列。请注意行尾输出换行。
【样例输入】
ABC..DE.G..F... (回车)
【样例输出】
ABCDEGF
CBEGDFA
CGEFDBA
#include <iostream>
#include <cstring>
using namespace std;
struct node
{
char data;
node *l, *r;
};
int size;
char cp[101];
node *creat(int *n)
{
if (*n < size&&cp[*n]!='.')
{
node *root = new node;
root->data = cp[*n];
(*n)++;
root->l = creat(n);
(*n)++;
root->r = creat(n);
return root;
}
else
return NULL;
}
void qianxu(node *root)
{
if (root)
{
cout << root->data;
qianxu(root->l);
qianxu(root->r);
}
}
void z(node *root)
{
if (root)
{
z(root->l);
cout << root->data;
z(root->r);
}
}
void h(node *root)
{
if (root)
{
h(root->l);
h(root->r);
cout << root->data;
}
}
int main()
{
cin >> cp;
size = strlen(cp);
int a = 0;
node *root = creat(&a);
qianxu(root);
cout << endl;
z(root);
cout << endl;
h(root);
}