1127 ZigZagging on a Tree(30分)
作者:互联网
假设二叉树中的所有键都是不同的正整数。可以通过给定的一对后序遍历和有序遍历序列来确定唯一的二叉树。这是一个简单的标准例程,可以按级别顺序打印数字。但是,如果您认为问题太简单了,那就太天真了。这次,您应该按“曲折顺序”打印数字-也就是说,从根开始,逐级打印数字,从左到右和从右到左交替。例如,对于以下树,您必须输出:1 11 5 8 17 12 20 15。
输入规格:
每个输入文件包含一个测试用例。对于每种情况,第一行给出一个正整数N(≤30),二叉树中的节点总数。第二行给出顺序,第三行给出后顺序。一行中的所有数字都用空格分隔。
输出规格:
对于每个测试用例,在一行中打印树的锯齿形顺序。一行中的所有数字必须完全由一个空格分隔,并且行尾不得有多余的空格。
输入样例:
8
12 11 20 17 1 15 8 5
12 20 17 11 15 8 5 1
样本输出:
1 11 5 8 17 12 20 15
有问题代码:
#include<bits/stdc++.h> using namespace std; const int maxn=1010; #define inf 0x3fffffff typedef struct node{ int data; struct node *lchild; struct node *rchild; }node,*pnode; vector<int> post,in; vector<vector<int> > v; int n; pnode build(int inL,int inR,int postL,int postR){ if(postL>postR){ return NULL; } pnode root=new node; root->data=post[postR]; int k; for(int k=inL;k<=inR;k++){ if(in[k]==post[postR]){ break; } } int len=k-inL; root->lchild=build(inL,k-1,postL,postL+len-1); root->rchild=build(k+1,inR,postL+len,postR-1); return root; } int cnt=0; void level(pnode root){ queue<pnode> q; pnode inx; q.push(root); inx=root; while(!q.empty()){ pnode t=q.front(); if(inx->lchild->data==t->data){ cnt++; inx=t; } v[cnt].push_back(t->data); q.pop(); if(t->lchild!=nullptr){ q.push(t->lchild); } if(t->rchild!=nullptr){ q.push(t->rchild); } } } int main(){ pnode root; scanf("%d",&n); post.resize(n); in.resize(n); v.resize(n); for(int i=0;i<n;i++){ scanf("%d",&post[i]); } for(int i=0;i<n;i++){ scanf("%d",&in[i]); } root=build(0,n-1,0,n-1); pnode nd=new node; nd->data=post[n-1]; level(nd); for(int i=0;i<cnt;i++){ if(i%2==0){ for(int j=0;j<v[i].size();i++){ if(j<v[i].size()-1) printf("%d ",v[i][j]); else{ printf("%d\n",v[i][j]); } } } else{ for(int j=v[i].size()-1;j>=0;j--){ if(j>0) printf("%d ",v[i][j]); else{ printf("%d\n",v[i][j]); } } } } printf("\n"); return 0; }
谁能告诉我,build函数里面哪一句错了?为什么进去了就出不来?
标签:node,int,data,30,Tree,pnode,postL,ZigZagging,root 来源: https://www.cnblogs.com/dreamzj/p/14443767.html