原题
题目描述
输入一个二叉树的先序串,输出其后序遍历结果。如果结点的子树为空,先序串的对应位置为空格符。
输入
第1行:先序串(结点数≤26,以单个大写字母表示)
输出
第1行:后序序列
样例输入
AB#C##D##
样例输出
CBDA
注:空格用#表示
分析
这道题不能像上一道题那么蹊跷来做了。
首先建树,详情见题中注释。
char a[105];
int len,i;//i逐渐增加
void build(int s){
if(i==len) return;//已经建完树了
char c=a[i];//当前的字符
i++;
if(!tree[s].l) tree[s].l=c;//如果树的左边是空的,就给左边赋值
else tree[s].r=c;//反之
if(c!=' ') build(c);
if(c!=' ') build(c);//再来递归两下
}
因为本题的重点就是建树,遍历什么的前面都讲过了,建完树以后就开心的遍历啦~~~
就为了写出这个建树程序,我脑花都散了,好了,源程序如下
╭~~~╮
(o@.@o)
源代码
#include<cstdio>
#include<cstring>
struct node{int l,r;};
node tree[105];
char a[105];
int len,i;
void build(int s){
if(i==len) return;
char c=a[i];
i++;
if(!tree[s].l) tree[s].l=c;
else tree[s].r=c;
if(c!=' ') build(c);
if(c!=' ') build(c);
}
void last(int g){
if(g){
last(tree[g].l);
last(tree[g].r);
if(g!=' ') printf("%c",g);
}
}
int main()
{
gets(a);
len=strlen(a);
build(0);
last(a[0]);
}