由树先序遍历和中序遍历输出其后续遍历

递归的三个必要条件

1. 弄明白递归的顺序。在递归的实现中,需要假设后续的调用已经完成,在此基础上,才实现递归的算法,先考虑后面的逻辑。
2. 分析清楚递归体的逻辑,然后写出来。具体的递归体需要解决什么样的问题。
3. 考虑清楚递归推出的边界条件。在哪些地方写return。

 

//============================================================================
// Name        : pm2bTree.cpp
// Author      : jry
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
#include <stdio.h>
using namespace std;


void printBackSeri(int _len,const char *pro,const char *mid){
    if( _len <= 1 ) {                // leaf nodes
        if( _len == 0 ) return;
        printf("%c", pro[0]); return;
    }

    int splitx = 0, i = 0, llen, rlen;
    for( i = 0; i < _len; i ++ )
        if(pro[0]==mid[i]) splitx = i;

    llen = splitx; rlen = _len-llen-1;
    char lpro[llen], lmid[llen];
    for( i = 0; i < llen; i ++ ){
        lpro[i] = pro[1+i];
        lmid[i] = mid[i];
    }
    printBackSeri(llen, lpro, lmid); // print back-seri left sub-tree

    char rpro[rlen], rmid[rlen];
    for( i = 0; i < rlen; i ++ ){
        rpro[i] = pro[i+1+llen];
        rmid[i] = mid[i+splitx+1];
    }
    printBackSeri(rlen, rpro, rmid); // print back-seri right sub-tree

    printf("%c", pro[0]);             // print the root
}

int main() {
    cout << "start" << endl;
    const char *pro = "ABDEFC", *mid = "EDFBAC";
    printBackSeri(6, pro, mid);
    printf("\n");
    cout << "DONE" << endl; // prints DONE
    return 0;
}

posted on 2011-09-29 14:20  amojry  阅读(422)  评论(0编辑  收藏  举报