PAT A1020 Tree Traversals
思路:利用后序和中序进行二叉树的重建,之后用BFS进行层序遍历打印
#include<cstdio>
#include<queue>
using namespace std;
const int maxn = 35;
typedef struct Node {
int data;
struct Node* left;
struct Node* right;
} Node;
int inOrder[maxn], postOrder[maxn];
Node* reCreate(int postL, int postR, int inL, int inR) {
if(postL > postR) return NULL;
Node* root = new Node;
root->data = postOrder[postR];
int i;
for(i = inL; i <= inR; i++)
if(inOrder[i] == postOrder[postR]) break;
int numL = i - inL;
root->left = reCreate(postL, postL + numL - 1, inL, i - 1);
root->right = reCreate(postL + numL, postR - 1, i + 1, inR);
return root;
}
int n;
int num = 0;
void BFS(Node* root) {
queue<Node*> q;
q.push(root);
while(!q.empty()) {
Node* temp = q.front();
q.pop();
printf("%d", temp->data);
num++;
if(num < n) printf(" ");
if(temp->left != NULL) q.push(temp->left);
if(temp->right != NULL) q.push(temp->right);
}
}
int main() {
scanf("%d", &n);
for(int i = 0; i < n; i++)
scanf("%d", &postOrder[i]);
for(int i = 0; i < n; i++)
scanf("%d", &inOrder[i]);
Node* root = reCreate(0, n - 1, 0, n - 1);
BFS(root);
printf("\n");
return 0;
}