#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <stack>
#include <queue>
#include <map>
using namespace std;
const int maxn=100010;
int n,in[maxn],post[maxn],lel[maxn],ind=0;
struct Node
{
int data;
Node* l;
Node* r;
};
Node* create(int postl,int postr,int inl,int inr)
{
if(postl > postr)
return NULL;
Node* root = new Node;
int k;
for(k=inr;k>=inl;k--) //遍历中序遍历的节点
{
if(in[k] == post[postr]) //如果找到中遍历的节点等于后序遍历的末尾节点也就是根节点
{
root->data = in[k];
break;
}
}
int numr = inr - k; //根节点右子树的个数
root->l = create(postl,postr - numr - 1,inl,k - 1); //寻找左子树的根节点
root->r = create(postr - numr,postr - 1,k+1,inr); //寻找右子树的根节点
return root;
}
void level(Node* root)
{
queue<Node*>q;
q.push(root);
while(!q.empty())
{
Node* x = q.front();
q.pop();
// printf("%d",x->data);
lel[ind++] = x->data;
if(x->l != NULL)
q.push(x->l);
if(x->r != NULL)
q.push(x->r);
}
}
int main()
{
freopen("1.txt","r",stdin);
scanf("%d",&n);
for(int i = 1;i<=n;i++)
{
scanf("%d",&post[i]);
}
for(int i = 1;i<=n;i++)
{
scanf("%d",&in[i]);
}
Node* root = create(1,n,1,n);
level(root);
for(int i = 0;i<ind;i++)
{
printf("%d",lel[i]);
if(i != ind - 1)
printf(" ");
}
}
1020 Tree Traversals (25分)(后序和中序确定二叉树)
最新推荐文章于 2023-04-02 08:59:13 发布