树的遍历 有后序遍历和中序遍历建立二叉树,并输出层次遍历

来源:互联网 发布:单片机无线模块 编辑:程序博客网 时间:2024/05/08 21:30
树的遍历   (25分)

给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。

输入格式:

输入第一行给出一个正整数NN\le 3030),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。

输出格式:

在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。

输入样例:

72 3 1 5 7 6 41 2 3 4 5 6 7

输出样例:

4 1 6 3 5 7 2

#include <iostream>#include <cstdio>#include <cmath>#include <queue>#include <stack>#include <map>#include <algorithm>#include <vector>#include <string>#include <cstring>#include <sstream>using namespace std;int n;int hou[50];int zhong[50];struct Btree{    int data;    Btree* left;    Btree* right;};typedef struct Btree Btree;int findindex(int *zhong,int x,int len){    for(int i=0;i<len;i++)    {        if(zhong[i]==x)        {            return i;        }    }}Btree* build(int *hou,int *zhong,int len){    if(len<=0) return NULL;    Btree* tmp=new Btree;    tmp->data=hou[len-1];    int index=findindex(zhong,hou[len-1],len);    tmp->left=build(hou,zhong,index);    tmp->right=build(hou+index,zhong+index+1,len-index-1);    return tmp;}int ans[500];int cur;void cenorder(Btree *root){    queue<Btree*> Q;    Q.push(root);    while(!Q.empty())    {        Btree *tmp=Q.front();        ans[cur++]=tmp->data;        if(tmp->left!=NULL)        {            Q.push(tmp->left);        }        if(tmp->right!=NULL)        {            Q.push(tmp->right);        }        Q.pop();    }}int main(){    scanf("%d",&n);    for(int i=0;i<n;i++)    {        scanf("%d",&hou[i]);    }    for(int i=0;i<n;i++)    {        scanf("%d",&zhong[i]);    }    Btree *root=build(hou,zhong,n);    cenorder(root);    for(int i=0;i<n;i++)    {        if(i==0) printf("%d",ans[i]);        else printf(" %d",ans[i]);    }    printf("\n");    return 0;}


0 0