假设一个二叉树上各结点的权值互不相同。
我们就可以通过其后序遍历和中序遍历来确定唯一二叉树。
请你输出该二叉树的 Z 字形遍历序列----也就是说,从根结点开始,逐层遍历,第一层从右到左遍历,第二层从左到右遍历,第三层从右到左遍历,以此类推。
例如,下图所示二叉树,其 Z 字形遍历序列应该为:1 11 5 8 17 12 20 15。
输入格式
第一行包含整数 N,表示二叉树结点数量。
第二行包含 N 个整数,表示二叉树的中序遍历序列。
第三行包含 N 个整数,表示二叉树的后序遍历序列。
输出格式
输出二叉树的 Z 字形遍历序列。
数据范围
1≤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
思路还是层序遍历记录层级,装入对应的vector下标中。最后输出的时候如果是奇数则reverse一下此时的vector。
#include <bits/stdc++.h>
using namespace std;
struct node
{
int data;
struct node*l,*r;
int level;
};
int max_level=0;
vector<int> v[1010];
int n,inorder[10001],post[10001];
struct node*create(int h1,int h2,int len)//后、中、长度
{
if(len==0)
return NULL;
struct node*p;
p=new node;
p->data=post[h1+len-1];
int i;
for(i = h2;inorder[i]!=post[h1+len-1];i++);
int l1 = i-h2;
int l2 = len-1-l1;
p->l = create(h1,h2,l1);
p->r = create(h1+l1,i+1,l2);
return p;
}
void cengxv(struct node*root)
{
root->level = 1;
queue<node*> q;
q.push(root);
while(!q.empty())
{
node* now = q.front();
max_level = max(max_level,now->level);
v[now->level].push_back(now->data);
q.pop();
if(now->l)
{
now->l->level = now->level+1;
q.push(now->l);
}
if(now->r)
{
now->r->level = now->level+1;
q.push(now->r);
}
}
}
int main()
{
cin >> n;
for(int i=1;i<=n;i++)
cin >>inorder[i];
for(int i=1;i<=n;i++)
cin >>post[i];
struct node*root = create(1,1,n);
cengxv(root);
for(int i=1;i<=max_level;i++)
{
if(i%2!=0)
reverse(v[i].begin(),v[i].end());
for(int each:v[i])
cout <<each<<" ";
}
return 0;
}