poj2255(Tree_Recover)

  二叉树的经典面试题,根据前序和中序求后序遍历。涉及到了递归算法的书写,这里我们只要根据当前的状态来写递归时候的变量就可以。

  写递归的时候需要做的是先分析当前的问题是什么,我们有什么,要得到什么。递归的过程肯定是把有的东西不断的传入,比如这道题有的东西就是前序和中序的字符串,要求的是后序。写递归的时候需要不断的把前序和中序的字符串传入,这里传入的s1,s2就是前序和中序的起始位置。然后需要传入一个当前字符串的长度,(因为前序和中序对应的长度是一样的,所以只需要一个长度就可以)。

需要注意的是:对于字符串处理的时候求长度的时候需要用后一段的减去前一段位置,因为坐标是实时变化的,所以不能用坐标来传递递归的信息。

值得回顾的点:递归变量的确定和划分时候的确定!

#include <iostream>
char pre[30];
char mid[30];
int len;
int length(char data[]){
    int count = 0;
    while(data[count]!='\0'){
        count++;    
    }
    return count;
}
void postorder(int s1,int s2,int N){//p是前序的起始位置,q是后序的起始位置,N是长度(前序和后序对应的长度是一样的)
    int pos = s2;
    if(N<=0){return;}
    while(mid[pos]!=pre[s1]){
        pos++;
    }
    postorder(s1+1,s2,pos-s2);//算字符串长度的时候都用后一段减去前一段来计算!因为有可能起始点不是零,所以直接用坐标来计算可能会出错。
    postorder(s1+pos-s2+1,pos+1,N-pos-1+s2);
    printf("%c",pre[s1]);
}
int main(){
    while(scanf("%s %s",pre,mid)!=EOF){
        len = length(pre);
        postorder(0,0,len);
        printf("\n"); 
    }
    
    return 0;
}

 

posted @ 2017-09-13 12:14  Pumpkin0227  阅读(238)  评论(0)    收藏  举报