题目链接:http://poj.org/problem?id=2255
题目大意:给你二叉树的前序遍历和中序遍历序列,让你输出后序遍历序列。
思路:使用前序遍历和中序遍历序列构造二叉树,然后用后序遍历输出。。。水题。。。
但是我也不知道为什么,也不想去想了,反正少了第46行( if( T->a != 0 ) )会导致输出多一个NUL。估计是因为二叉树中多加入了一个叶子节点。但是为什么呢。。。真的不想看了,这道题浪费了我三个小时。。。起初我在fedora上测试样例数据没有问题,然后提交后WA。换win7后直接样例出输出都不对。最后好不容易发现是上面说的问题。。。心好累 >_<
///2014.7.16
///poj2255
//Accepted 676K 0MS G++ 1243B 2014-07-17 15:32:51
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
char vlr[30],lvr[30];
int length;
struct node{
char a;
node * lson, * rson;
node(){ a=0 ; lson = rson = NULL; }
};
node * T;
void build(int l1,int r1,int l2,int r2,node * & rt){
rt = new node;
rt->a = vlr[l1];
rt->lson = rt->rson = NULL;
if( l1>=r1 ) return ;
int loc = l2;
while( lvr[loc] != vlr[l1] ) loc++;
if( loc != l2 ){
int lengthOfLson = loc - l2;
int x = l1+1;
int y = l1+lengthOfLson;
build(x,y,l2,loc-1,rt->lson);
}
if( loc != r2 ){
int lengthOfRson = r2 - loc;
int x = r1 - lengthOfRson + 1;
int y = r1;
build(x,y,loc+1,r2,rt->rson);
}
return ;
}
void lrv(node * T){
if( T==NULL ) return ;
lrv( T->lson );
lrv( T->rson );
if( T->a != 0 )//滤调二叉树众多加入的那个神奇的叶子节点
printf("%c",T->a );
}
int main(){
// freopen("in","r",stdin);
// freopen("out","w",stdout);
while( ~scanf("%s%s",vlr,lvr) ){
T = NULL;
length = strlen(vlr);
build(0,length,0,length,T);
lrv( T );
printf("\n");
}
return 0;
}