数据结构之 二叉树---求二叉树后序遍历和层次遍历(先建树,再遍历)

数据结构实验之求二叉树后序遍历和层次遍历

Time Limit: 1000MS Memory limit: 65536K

题目描述

 已知一棵二叉树的前序遍历和中序遍历,求二叉树的后序遍历。

输入

 输入数据有多组,第一行是一个整数t (t<1000),代表有t组测试数据。每组包括两个长度小于50 的字符串,第一个字符串表示二叉树的先序遍历序列,第二个字符串表示二叉树的中序遍历序列。

输出

每组第一行输出二叉树的后序遍历序列,第二行输出二叉树的层次遍历序列

示例输入

2

abdegcf

dbgeafc

xnliu

lnixu

示例输出

dgebfca

abcdefg

linux

xnuli


第一种方法:根据字符串的递推, 由先序、中序直接计算后序串! 在建树,进行层次遍历!
代码:
#include <iostream>

#include <iomanip>

#include <string>

#include <string.h>

#include <stdio.h>

#include <algorithm>

#include <queue>

#include <vector>



using namespace std;



typedef struct node

{

    char a;

    struct node *ll;

    struct node *rr;

}Binode, *tree;



void build(int len, char *s1, char *s2, char *s) //先序中序 推 后序

{

    if(len<=0)

      return;

    int pos; //位置

    int i;



    for(i=0; i<len; i++)

    {

        if(s2[i]==s1[0])

        {

            pos=i;

            break;

        }

    }

    build(pos, s1+1, s2, s );

    build(len-pos-1, s1+pos+1, s2+pos+1, s+pos );

    s[len-1]=s1[0];

}





//根据先序中序建树

struct node*creat(struct node *root, char *s, char *s1, int n)

{

    if(n<=0)

      return NULL;

    root=new node;

    root->a=s[0];



    int p=strchr(s1, s[0] )-s1;



    root->ll=creat( root->ll, s+1, s1, p );

    root->rr=creat( root->rr, s+p+1, s1+p+1, n-p-1 );



    return root;

}





//层次遍历 二叉树

void Level_Order(tree root)

{

    queue<tree>q;

    tree qq;



    if(root==NULL)

      return ;

    Binode *p=root;

    cout<<(p->a);



    if(p->ll)

      q.push( p->ll );

    if(p->rr)

      q.push( p->rr );



    while(!q.empty())

    {

        qq=q.front();

        q.pop();

        cout<<qq->a;

        if(qq->ll)

          q.push(qq->ll);

        if(qq->rr)

          q.push(qq->rr);

    }

    return;

}

int main()

{

    int t;

    cin>>t;

    char s1[100], s2[100];

    char s3[100];

    while(t--)

    {

        memset(s3, '\0', sizeof(s3));



        scanf("%s", s1); //中序

        scanf("%s", s2); //后序

        int len=strlen(s1);

        build(len, s1, s2, s3);

        printf("%s\n", s3); //输出后序遍历



        //计算层次遍历

        tree root, tt;

        root=creat(tt, s1, s2, len);



        Level_Order( root);

        cout<<endl;

    }

    return 0;

}

 

 

第二种方法:先根据先序、中序建树,在进行后序遍历和层次遍历
代码:
#include <iostream>

#include <iomanip>

#include <string>

#include <string.h>

#include <stdio.h>

#include <algorithm>

#include <queue>

#include <vector>



using namespace std;



typedef struct node

{

    char a;

    struct node *ll;

    struct node *rr;

}Binode, *tree;





//根据先序中序建树

struct node*creat(struct node *root, char *s, char *s1, int n)

{

    if(n<=0)

      return NULL;

    root=new node;

    root->a=s[0];



    int p=strchr(s1, s[0] )-s1;



    root->ll=creat( root->ll, s+1, s1, p );

    root->rr=creat( root->rr, s+p+1, s1+p+1, n-p-1 );



    return root;

}



void postorder(tree p)

{

    if(p)

    {

        postorder(p->ll);

        postorder(p->rr);

        printf("%c", p->a );

    }

}



//层次遍历 二叉树

void Level_Order(tree root)

{

    queue<tree>q;

    tree qq;



    if(root==NULL)

      return ;

    Binode *p=root;

    cout<<(p->a);



    if(p->ll)

      q.push( p->ll );

    if(p->rr)

      q.push( p->rr );



    while(!q.empty())

    {

        qq=q.front();

        q.pop();

        cout<<qq->a;

        if(qq->ll)

          q.push(qq->ll);

        if(qq->rr)

          q.push(qq->rr);

    }

    return;

}





int main()

{

    int t;

    cin>>t;

    char s1[100], s2[100];

    char s3[100];



    while(t--)

    {

        memset(s3, '\0', sizeof(s3));



        scanf("%s", s1); //中序

        scanf("%s", s2); //后序

        int len=strlen(s1);



        //计算层次遍历

        tree root, tt;

        root=creat(tt, s1, s2, len);

        postorder(root);

        cout<<endl;

        

        Level_Order( root);

        cout<<endl;

    }

    return 0;

}

 
   

 


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