L2-006. 树的遍历

来源:互联网 发布:手机锁机软件 编辑:程序博客网 时间:2024/06/05 20:22

L2-006. 树的遍历

时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越

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

输入格式:

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

输出格式:

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

输入样例:
72 3 1 5 7 6 41 2 3 4 5 6 7
输出样例:
4 1 6 3 5 7 2

#include<cstdio>#include<iostream>#include<vector>#include<queue>using namespace std;int post[40];int in[40];vector<int>vec;struct node{int num;struct node* left;struct node* right;};struct node* build(int p1,int p2,int i1,int i2){if(p1>p2||i1>i2)return NULL;int r;for(int i=i1;i<=i2;i++){if(in[i]==post[p2]){r=i;break;}}struct node* root=new node();root->num=in[r];root->left=build(p1,p1+r-i1-1,i1,r-1);root->right=build(p1+r-i1,p2-1,r+1,i2);return root;}queue<struct node*>q;void order(struct node* root){q.push(root);while(!q.empty()){struct node* tmp=q.front();q.pop();vec.push_back(tmp->num);if(tmp->left)q.push(tmp->left);if(tmp->right)q.push(tmp->right);}}int main(){int n;scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d",&post[i]);}for(int i=0;i<n;i++){scanf("%d",&in[i]); }struct node* root=NULL;root=build(0,n-1,0,n-1);order(root);for(int i=0;i<vec.size()-1;i++){printf("%d ",vec[i]);}printf("%d\n",vec[vec.size()-1]);return 0;}
原创粉丝点击