题目大意:给出中序和后序序列, 还原二叉树,然后进行一种Zigzag的层序遍历,即从根节点(记为第0层)开始输出,第1层从左向右输出节点,第2层从右向左输出节点...依次循环。
首先是根据中序和后序序列还原二叉树,这个我还不太熟,debug了几次才成功,注意root = NULL的时候要 new 一个节点。然后就是进行普通的层序遍历,并且更新每个节点的层数信息layer域。同时因为节点数不超过30,开一个大小为30的vector[31]数组,用于记录每一层遍历的结果。最后,如果是奇数层,直接输出vector[k],如果是偶数层,就倒序输出vector[k]。
AC代码如下:
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <cstring>
using namespace std;
const int MAXN = 31;
struct Node
{
int data;
Node* left;
Node* right;
int layer;
Node(int data)
{
this->data = data;
this->left = NULL;
this->right = NULL;
this->layer = 0;
}
Node(){};
};
vector<int> in, post;
void creatFromInPost(Node*& root, int inl, int inr, int postl, int postr)
{
if(postl > postr) return;
if(root == NULL) root = new Node(post[postr]);
int i;
for (i = inl; i <= inr; ++i)
{
if(in[i] == root->data) break;
}
int leftNum = i - inl;
creatFromInPost(root->left, inl, i-1, postl, postl + leftNum - 1);
creatFromInPost(root->right, i+1, inr, postl + leftNum, postr-1);
}
vector<int> v[MAXN];
void layerOrder(Node* root, int& maxLayer)
{
queue<Node*> q;
q.push(root);
while(!q.empty())
{
Node* front = q.front();
q.pop();
v[front->layer].push_back(front->data);
if(front->layer > maxLayer) maxLayer = front->layer;
if(front->left)
{
front->left->layer = front->layer + 1;
q.push(front->left);
}
if(front->right)
{
front->right->layer = front->layer + 1;
q.push(front->right);
}
}
}
int main()
{
int N;
cin >> N;
in.resize(N);
post.resize(N);
for (int i = 0; i < N; ++i)
{
scanf("%d", &in[i]);
}
for (int i = 0; i < N; ++i)
{
scanf("%d", &post[i]);
}
Node* root = NULL;
creatFromInPost(root, 0, N-1, 0, N-1);
int maxLayer = 0;
layerOrder(root, maxLayer);
int printCount = 0;
for (int i = 0; i <= maxLayer; ++i)
{
if(i % 2 == 0)
{
for (int j = v[i].size() - 1; j >= 0; --j)
{
printf("%d", v[i][j]);
printCount++;
if(printCount < N) printf(" ");
}
}
else
{
for (int j = 0; j < v[i].size(); ++j)
{
printf("%d", v[i][j]);
printCount++;
if(printCount < N) printf(" ");
}
}
}
return 0;
}