题目大意:给出二叉树的后序和中序遍历序列,输出层序遍历结果。
常规问题,先建树再遍历即可。
AC代码如下:
#include <iostream>
#include <vector>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
struct Node
{
int data;
Node* left;
Node* right;
Node(int data):data(data)
{
this->left = NULL;
this->right = NULL;
}
};
void createFromInPost(Node* &node, vector<int> &in, vector<int>&post, int inl, int inr, int postl, int postr)
{
if(postl > postr) return;
if(node == NULL) node = new Node(post[postr]);
int index;
for(index = inl; index <= inr; index++)
{
if(in[index] == node->data) break;
}
int leftNum = index - inl;
createFromInPost(node->left, in, post, inl, index - 1, postl, postl + leftNum - 1);
createFromInPost(node->right, in, post, index+1, inr, postl + leftNum, postr-1);
}
void layerOrder(Node* node, int count)
{
queue<Node*> q;
q.push(node);
int printCnt = 0;
while(!q.empty())
{
Node* now = q.front();
q.pop();
printf("%d", now->data);
printCnt++;
if(printCnt < count) printf(" ");
if(now->left) q.push(now->left);
if(now->right) q.push(now->right);
}
}
int main()
{
int N;
cin >> N;
vector<int> post(N), in(N);
for (int i = 0; i < N; ++i)
{
scanf("%d", &post[i]);
}
for (int i = 0; i < N; ++i)
{
scanf("%d", &in[i]);
}
Node *root = NULL;
createFromInPost(root, in, post, 0, N-1, 0, N-1);
layerOrder(root, N);
return 0;
}