遍历问题

来源:互联网 发布:json xml 比较优缺点 编辑:程序博客网 时间:2024/05/29 23:23

学过数据结构不久,就算当时懂了也会忘记,昨天一直在想树的遍历问题,弄到今天才弄懂,写给在遍历问题上同有困惑的童鞋~~,若觉不好,我是菜鸟,请见谅!

遍历问题

时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte
总提交:78 测试通过:58
描述

已知二叉树的中序和先序遍历可以唯一确定后序遍历、已知中序和后序遍历可以唯一确定先序遍历,但已知先序和后序,却不一定能唯一确定中序遍历。现要求根据输入的中序遍历结果及某一种遍历,要求输出另一种遍历。

输入

输入包括若干个测试用例,第一行为一个自然数n,表示用例个数,接下来4n行,即每个用例占4行,其中第一行表示第一种遍历方式,第二行为第一种遍历结果,第三行为第二种遍历方式,第4行为第二种遍历结果。注明:先序遍历方式用“pre”表示,中序遍历方式用“in”表示,后序遍历方式用“post”表示。

输出

对每个测试用例,输出相应的另一种遍历方式及结果。每个用例用一行输出,输出格式为先输出相应的遍历方式,然后一个冒号,再加一个空格,最后输出相应的遍历结果。

样例输入

1
pre
ABDFCEG
in
BFDAEGC
样例输出

post: FDBGECA
题目来源

DataStructure(数据结构)算法

<strong><span style="font-size:14px;">#include<iostream>#include<cstring>using namespace std;struct node{    char v;    int r,l;}List[500];char in[500];int top;int weizhi[500];void Inset(int p,char k)///top是指向定点元素的下标{  //  cout<<weizhi[List[p].v]<<" "<<weizhi[k]<<endl;    if(weizhi[List[p].v]<weizhi[k])///判断左右子树    {        if(List[p].r==0)        {            List[p].r = top;            List[top].v = k;            List[top].r=List[top].l=0;            top++;        }        else///若根有右子树,则此右子树为根,判断其下个顶点        {            Inset(List[p].r,k);        }    }    else        {            if(List[p].l==0)            {                List[p].l = top;                List[top].v = k;                List[top].r=List[top].l=0;                top++;            }            else            {                Inset(List[p].l,k);            }        }}void post(int head)///后序遍历 左右根{    if(List[head].l!=0)    post(List[head].l);    if(List[head].r!=0)    post(List[head].r);    cout<<List[head].v;}void pre(int head)///先序遍历 根左右{    cout<<List[head].v;    if(List[head].l!=0)    pre(List[head].l);    if(List[head].r!=0)    pre(List[head].r);}int main(){    int t,i,j,len;    cin>>t;    char s[10],g[500];    bool p;    while(t--)    {        int k=2;        p=false;        top=2;///top是指向定点元素的下标        while(k--){            cin>>s;            if(s[0]=='i')            {                cin>>in;            }else{                if(s[1]=='r')                    p=true;                cin>>g;///用来输入先序或者后序的字符串,p为真则为先序            }        }        if(p)///先序        {            List[1].v = g[0];            List[1].r=List[1].l=0;            len = strlen(g);            for(i=0;in[i]!='\0';i++)                {                    weizhi[in[i]]=i;///用来记录每个字符的前后顺序                   /// cout<<int(in[i])<<" ";                }               /// cout<<endl;            for(i=1;i<len;i++)            {                Inset(1,g[i]);///先序建树,传入参数位置 1,每个字符            }            cout<<"post: ";            post(1);///后序函数            cout<<endl;        }else{            len = strlen(g);///后续建立树            List[1].v = g[len-1];            List[1].r=List[1].l=0;            for(i=0;in[i]!='\0';i++)                weizhi[in[i]]=i;            for(i=len-2;i>=0;i--)            {                Inset(1,g[i]);///后续建树,用的是顺序链表            }            cout<<"pre: ";            pre(1);            cout<<endl;        }    }    return 0;}</span></strong>


0 0
原创粉丝点击