由先序遍历和中序遍历序列建立二叉树

题目链接//zjnu

//poj

题解:

一、递归建树,递归输出就行。

这个代码在poj上能过,zjnu上会re



#include 
#include 
#include 
#include 
#include 
using namespace std;
typedef struct BiTNode{
    char data;
    struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
BiTNode* CreatBiTree(char *pre,char *in,int n){
    if(n<=0) return NULL;
    BiTree bt;
    bt=(BiTree)malloc(sizeof(BiTree));
    bt->data=pre[0];
    char *p=strchr(in,pre[0]);
    int len=p-in;
    bt->lchild=CreatBiTree(pre+1,in,len);
    bt->rchild=CreatBiTree(pre+len+1,p+1,n-len-1);
    return bt;
}
void PostOrder(BiTree T){
    if(T==NULL) return;
    PostOrder(T->lchild);
    PostOrder(T->rchild);
    printf("%c",T->data);
    return;
}
char a[100005],b[10005];
int main(){
    while(scanf("%s%s",a,b)!=EOF){
        BiTree T=CreatBiTree(a,b,strlen(a));
        PostOrder(T);
        printf("\n");
    }
    return 0;
}

二、建树和输出并排进行。题目只要求输出,就可以直接按照后序遍历的方式遍历,甚至不需要建树。

这个代码两边都可以过



#include 
#include 
#include 
#include 
#include 
using namespace std;
char a[100005],b[100005];
void CreatBiTree(char *pre,char *in,int n){
    if(n<=0) return;
    int len=strchr(in,pre[0])-in;
    CreatBiTree(pre+1,in,len);
    CreatBiTree(pre+len+1,in+len+1,n-len-1);
    printf("%c",pre[0]);
}
int main(){
    while(scanf("%s%s",a,b)!=EOF){
        CreatBiTree(a,b,strlen(a));
        printf("\n");
    }
    return 0;
}

你可能感兴趣的:(数据结构)