题目链接:pat1127A
大意:
给出一棵二叉树的中序、后序遍历,要求按z字形输出此二叉树的层次遍历(z字形:根节点为第1层,奇数层从左往右输出,偶数层从右往左输出)
思路:
此题难点在于z字形输出,正常层序遍历层数小的优先输出而每层下标小的优先输出,容易想到z字形输出只要在层数为奇数时将下标大的优先输出就可实现。
在这里插入代码片#include<iostream>
#include<queue>
#include<vector>
using namespace std;
int n;
int inorder[35],postorder[35];
// void zigzag(int l1,int l2,int l){//l1中序左,l2后序左
// if(l<=0)return ;
// int root,i;
// root=postorder[l2+l-1];
// for(i=0;;i++){
// if(inorder[i]==root)break;//中序的根节点
// }
// int leftl=i-l1;
// int rigthl=l-leftl-1;
// cout<<leftl<<" "<<rigthl<<endl;
// cout<<root<<" ";
// zigzag(l1,l2,leftl);//左
// zigzag(i+1,l2+leftl,rigthl);//右
// }//弄成前序了
typedef struct node{
int val;
node *left,*right;
}node,*tree;
node* makenode(int l1,int l2,int l){
if(l<=0)return nullptr;
node *root=new node;
root->val=postorder[l2+l-1];
int i;
for(i=0;;i++){
if(inorder[i]==root->val)break;//中序的根节点
}
int leftl=i-l1;
int rigthl=l-leftl-1;
root->left=makenode(l1,l2,leftl);//左
root->right=makenode(i+1,l2+leftl,rigthl);//右
return root;
}
void Print(tree root){
cout<<root->val<<" ";
if(root->left!=nullptr)Print(root->left);
if(root->right!=nullptr)Print(root->right);
}
// void levelPrint(tree &root){
// queue<node*>q;
// node *p=new node;
// if(root!=nullptr)q.push(root);
// while(!q.empty()){
// p=q.front();
// //cout<<p->val<<" ";
// if(p->left!=nullptr){
// q.push(p->left);
// }
// if(p->right!=nullptr){
// q.push(p->right);
// }
// cout<<p->val<<" ";
// q.pop();
// }
// }//弄成普通层序了
vector<int>ans;
void zigzag(tree &root){
node *p=new node;
queue<node*>q;
int leval=0;
q.push(root);
while(int root_count=q.size()){
leval++;
vector<int>temp;
while(root_count--){
p=q.front();
q.pop();
if(p->left)q.push(p->left);
if(p->right)q.push(p->right);
temp.push_back(p->val);
}
if(leval%2==1){//奇数右往左
for(int i=temp.size()-1;i>=0;i--){
ans.push_back(temp[i]);
}
}else{
for(int i=0;i<temp.size();i++){
ans.push_back(temp[i]);
}
}
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++)cin>>inorder[i];//中序
for(int i=0;i<n;i++)cin>>postorder[i];//后序
tree root;
root=makenode(0,0,n);
//Print(root);
zigzag(root);
for(int i=0;i<ans.size();i++){
if(i)cout<<" ";
cout<<ans[i];
}
}