您的位置:首页 > 其它

NYOJ_重建二叉树

2016-07-08 09:36 288 查看

重建二叉树

时间限制:1000 ms  |  内存限制:65535 KB

难度:3
描述 题目很简单,给你一棵二叉树的后序和中序序列,求出它的前序序列(So easy!)。
输入输入有多组数据(少于100组),以文件结尾结束。

每组数据仅一行,包括两个字符串,中间用空格隔开,分别表示二叉树的后序和中序序列(字符串长度小于26,输入数据保证合法)。输出每组输出数据单独占一行,输出对应得先序序列。样例输入
ACBFGED ABCDEFG
CDAB CBAD

样例输出
DBACEGF
BCAD

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=756

分析:根据 后序 和 中序 遍历   求前序遍历

代码:

#include<cstdlib>

#include<string.h>

#include<iostream>

#include<cmath>

#include<cstring>

#include<algorithm>

#include<iomanip>

#include<ctime>

#include<cstdio>

#include<stack>

#include<map>

#include<queue>

#include<vector>

using namespace std;

typedef struct BiTNode

{

    char data;

    struct BiTNode *lchild,*rchild;

}BiTNode,*BiTree;

方法一:

//根据 后序 和 中序 遍历   重建二叉树

void GetPreOrder(char *last,char *mid,BiTree &T,int len)

{

    if(!len)

    {

        T=NULL;

        return;           //第一次敲忘记加return导致一直错误

    }

        

    char ch=last[len-1];

    int index=0;

    while(ch!=mid[index])   index++;

    T=new BiTNode;

    T->data = mid[index];    

    GetPreOrder(last,mid,T->lchild ,index);

    GetPreOrder(last+index,mid+index+1,T->rchild ,len-index-1);    

}

void PreOrder(BiTree &T)

{

    if(T==NULL)

        return ;

    putchar(T->data);

    PreOrder(T->lchild);

    PreOrder(T->rchild);

}

int main()

{

    char last[30],mid[30];

    while(scanf("%s%s",last,mid)!=EOF)

    {

        BiTree T;

        GetPreOrder(last,mid,T,strlen(last));

        PreOrder(T);

        cout<<endl;

    }    

    return 0;

}

方法二:

其实是可以不用重建二叉树

void ReBuild(char *post, char *in ,int len)

{

    if(len>0)

    {

        int pos=strchr(in,post[len-1])-in;

        cout<<post[len-1];

        ReBuild(post,in,pos);

        ReBuild(post+pos,in+pos+1,len-pos-1);                

    }

}

 

 int main()

 {

     char post[30],in[30];

     while(~scanf("%s%s",post,in))

     {

         ReBuild(post,in,strlen(in));

         cout<<endl;

    }     

     return 0;

 }

题目延伸: 已知前序遍历和中序遍历求后序遍历

void GetPostOrder(char *pre, char *mid, int len)

{

    if(!len)

    {

        return;

    }

    int index =0;

    while(mid[index]!=pre[0])   index++;

    

    GetPostOrder(pre+1,mid,index);

    GetPostOrder(pre+index+1,mid+index+1,len-index-1);    

    cout<<pre[0];    

}

int main()

{

    char pre[30],mid[30];

    while(~scanf("%s%s",pre,mid))

    {

        GetPostOrder(pre,mid,strlen(mid));

        cout<<endl;        

    }    

    return 0;

}

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: