数据结构实验之二叉树二:遍历二叉树
Time Limit: 1000MS Memory Limit: 65536KB
Problem Description
已知二叉树的一个按先序遍历输入的字符序列,如abc,,de,g,,f,,, (其中,表示空结点)。请建立二叉树并按中序和后序的方式遍历该二叉树。
Input
连续输入多组数据,每组数据输入一个长度小于50个字符的字符串。
Output
每组输入数据对应输出2行:
第1行输出中序遍历序列;
第2行输出后序遍历序列。
Example Input
abc,,de,g,,f,,,
Example Output
cbegdfa
cgefdba
补充:所谓的先序,中序,后序是对于根节点的访问顺序来的。
访问3个东西:
先:根节点,左子树,右子树
中:,左子树,根节点,右子树
后:左子树,右子树,根节点
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAXN=50+5;
struct node
{
char key;
struct node *left,*right;
};
struct node *creat()
{
struct node *p=new node;
p->left=NULL;
p->right=NULL;
return p;
};
int num;
int l;
char s[MAXN];
struct node*build_tree(struct node *root)
{
if(num>l)return 0;
if(s[num]==',')return 0;
root=creat();
root->key=s[num];
num++;
root->left=build_tree(root->left);
num++;
root->right=build_tree(root->right);
return root;
};
void mid_print(struct node *root)
{
if(!root)return;
if(root->left)mid_print(root->left);
printf("%c",root->key);
if(root->right)mid_print(root->right);
}
void out_print(struct node *root)
{
if(!root)return ;
if(root->left)out_print(root->left);
if(root->right)out_print(root->right);
printf("%c",root->key);
}
int main()
{
while(~scanf("%s",s))
{
l=strlen(s);
num=0;
struct node *root=build_tree(root);
mid_print(root);
puts("");
out_print(root);
puts("");
}
return 0;
}