大致题意就是给出一棵树的后序、中序遍历序列,然后建一棵树,,以蛇皮走位(奇层逆序,偶层顺序)输出其层序遍历序列。
1 #include<iostream> 2 #include<vector> 3 #include<queue> 4 #include<map> 5 using namespace std; 6 7 const int maxn = 31; 8 struct Node { 9 int data,level; 10 Node* lchild; 11 Node* rchild; 12 }; 13 int in[maxn],pos[maxn]; 14 map<int,vector<int>> mp; 15 Node* create(int posL,int posR,int inL,int inR) { 16 if(inL > inR) return NULL; 17 Node* node = new Node; 18 node->data = pos[posR]; 19 int k = inL,leftNum; 20 while(in[k] != pos[posR]) k++; 21 leftNum = k-inL; 22 node->lchild = create(posL,posL+leftNum-1,inL,k-1); 23 node->rchild = create(posL+leftNum,posR-1,k+1,inR); 24 return node;//总是忘记这个小可爱 25 } 26 27 void BFS(Node* root) { 28 queue<Node*> q; 29 root->level = 0; 30 q.push(root); 31 while(!q.empty()) { 32 Node* node = q.front(); 33 mp[node->level].push_back(node->data); 34 q.pop(); 35 if(node->lchild != NULL) { 36 node->lchild->level = node->level+1; 37 q.push(node->lchild); 38 } 39 if(node->rchild != NULL) { 40 node->rchild->level = node->level+1; 41 q.push(node->rchild); 42 } 43 } 44 } 45 int main() { 46 int n,flag = 0; 47 cin>>n; 48 for(int i = 0; i < n; ++i) cin>>in[i]; 49 for(int i = 0; i < n; ++i) cin>>pos[i]; 50 Node* root = create(0,n-1,0,n-1); 51 BFS(root); 52 for(auto it:mp) { 53 if(flag == 0) printf("%d",it.second[0]); 54 else if(flag % 2 == 1) { 55 for(int i = 0; i < it.second.size(); ++i) printf(" %d",it.second[i]); 56 } else { 57 for(int i = it.second.size()-1; i >= 0; --i) printf(" %d",it.second[i]); 58 } 59 flag++; 60 } 61 return 0; 62 }