題意:
給出一個樹的中序和後序遍歷結果,求它的Z字型層序遍歷,也就是偶數層從右往左,奇數層從左往右遍歷~
思路:
這是我那次pat考試的題目當時做出來了有點忘記了今天在回顧一下吧.
#include<bits/stdc++.h>
using namespace std;
const int maxn = 35;
int in[maxn],post[maxn],n;
struct node
{
int val;
node *l;
node *r;
node()
{
l = r = nullptr;
}
};
int cur;
int find_root(int val)
{
for(int i = 1;i <= n;++i)
{
if(in[i] == val)
return i;
}
return -1;
}
node* createTree(node *root,int left,int right)
{
if(left > right) return nullptr;
int val = post[cur--];
int pos = find_root(val);
node *tmp = new node;
tmp -> val = val;
tmp -> r = createTree(tmp -> r,pos + 1,right);
tmp -> l = createTree(tmp -> l,left,pos - 1);
return tmp;
}
void zigzag(node *root)
{
int ans[maxn],mid[maxn],ans_num = 0,mid_num = 0;
queue<node *>Q;
while(!Q.empty()) Q.pop();
Q.push(nullptr);
Q.push(root);
int flag = 0;
while(!Q.empty())
{
node *p = Q.front();Q.pop();
//if(p == root)
// cout << ans_num << endl;
if(p == nullptr)
{
if(!Q.empty()) Q.push(nullptr);
if(!flag)
{
// puts("**");
for(int i = 0;i < mid_num;++i)
ans[ans_num++] = mid[i];
mid_num = 0;
}
else
{
for(int i = mid_num - 1;i >= 0;--i)
ans[ans_num++] = mid[i];
mid_num = 0;
}
flag = 1 - flag;
}
else
{
mid[mid_num++] = p -> val;
if(p -> l != nullptr)
Q.push(p -> l);
if(p -> r != nullptr)
Q.push(p -> r);
}
}
for(int i = 0;i < ans_num;++i)
{
printf("%d%c",ans[i],i == ans_num - 1?'\n':' ');
}
return ;
}
int main()
{
while(~scanf("%d",&n))
{
for(int i = 1;i <= n;++i)
scanf("%d",&in[i]);
for(int i = 1;i <= n;++i)
scanf("%d",&post[i]);
node *root = nullptr;
cur = n;
root = createTree(root,1,n);
zigzag(root);
}
return 0;
}