poj2255 Tree Recovery 二叉树,这题整我好惨

5 篇文章 0 订阅

题目链接: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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值