【题意】
根据二叉树的后序、中序遍历得到它的层序遍历
【思路】
由后序、中序遍历构造出二叉树,再借助队列实现层序遍历即可
#include <iostream>
#include <queue>
using namespace std;
#define MAXN 30
int postorder[MAXN],inorder[MAXN];
typedef struct node{
int num;
node *left;
node *right;
}BiNode;
BiNode *bulidTree(int postLeft, int postRight, int inLeft, int inRight){
BiNode *father;
int leftNum,rightNum;
father = (BiNode *)malloc(sizeof(BiNode));
father->num = postorder[postRight];
for(int i=inLeft; i<=inRight; i++){
if(inorder[i]==postorder[postRight]){
leftNum = i-inLeft;
rightNum = inRight-i;
break;
}
}
if(leftNum){
father->left = bulidTree(postLeft, postLeft+leftNum-1, inLeft, inLeft+leftNum-1);
}
else{
father->left = NULL;
}
if(rightNum){
father->right = bulidTree(postRight-rightNum, postRight-1, inRight-rightNum+1, inRight);
}
else{
father->right = NULL;
}
return father;
}
int main(int argc, char const *argv[])
{
int n;
BiNode *head;
queue<BiNode*> result;
cin >> n;
for(int i=0; i<n; i++){
cin >> postorder[i];
}
for(int i=0; i<n; i++){
cin >> inorder[i];
}
head = bulidTree(0,n-1,0,n-1);
result.push(head);
bool first = true;
while(!result.empty()){
if(first){
first = false;
}
else{
cout << " ";
}
BiNode *tmp = result.front();
cout << tmp->num;
if(tmp->left!=NULL){
result.push(tmp->left);
}
if(tmp->right!=NULL){
result.push(tmp->right);
}
result.pop();
}
system("pause");
return 0;
}