层序遍历要借助队列,然后就是中序和后序可以得到前序 。懒得多说了反正书上都有
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn = 100;
struct node
{
int data;
node* Lchild;
node* Rchild;
};
int in[maxn], post[maxn];//中序和后序
int n;
node* create(int postL, int postR, int inL, int inR)//利用中序后序建立二叉树
{
if(postL > postR){
return NULL;
}
node* root = new node;
root->data = post[postR];
int k;
for(k = inL; k <= inR; k++){
if(in[k] == post[postR]){
break;
}
}
int numleft = k - inL;
root->Lchild = create(postL, postL + numleft - 1, inL, k-1);
root->Rchild = create(postL+numleft, postR - 1, k + 1, inR);
return root;
}
int num = 0;
void BFS(node *root)//层序遍历
{
queue<node*> q;
q.push(root);
while(!q.empty()){
node* now = q.front();
q.pop();
cout << now->data;
num++;
if(num < n) cout << " ";
if(now->Lchild != NULL) q.push(now->Lchild);
if(now->Rchild != NULL) q.push(now->Rchild);
}
}
int main()
{
cin >> n;
for(int i = 0; i < n; i++){
cin >> post[i];
}
for(int i = 0; i < n; i++){
cin >> in[i];
}
node* root = create(0, n-1, 0, n-1);
BFS(root);
return 0;
}