PATL2-006.树的遍历
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
题解:
根据中序遍历(左中右),后序遍历(左右中);
由每次后续遍历区间的最后一个节点为跟节点,在中序遍历中找到这个节点即可将树的左子树和右子树区分,通过递归不断还原整棵树。
#include <stdio.h>
#include <iostream>
#include <queue>
using namespace std ;
#define MAX 50
struct node
{
int l , r ;
}tree[MAX];
int la[MAX] , in[MAX] , ans[MAX] ,n;
int build(int lal , int lar , int inl , int inr)
{
if(inr < inl) return 0 ;
int root = la[lar] ;
int p1 , p2 ;
p1 = inl ;
while(in[p1] != root) p1 ++ ;
p2 = p1 - inl ;
tree[root].l = build(lal,lal + p2 - 1,inl , p1-1 );
tree[root].r = build(lal+ p2 ,lar - 1, p1+1 , inr);
return root ;
}
void BFS()
{
queue<int> q ;
q.push(la[n-1]) ;
int temp = la[n-1] ,tt = 0;
while(!q.empty())
{
temp = q.front() ;
q.pop();
if(temp == 0) break;
ans[tt++] = temp ;
if(tree[temp].l!=0)
q.push(tree[temp].l);
if(tree[temp].r!=0)
q.push(tree[temp].r);
}
for(int i = 0 ; i < n ; i ++)
{
if(i == n - 1)
printf("%d\n" , ans[i]) ;
else
printf("%d " , ans[i]) ;
}
}
int main()
{
cin >> n ;
for(int i = 0 ; i < n ; i ++)
cin >> la[i] ;
for(int i = 0 ; i < n ; i ++)
cin >> in[i] ;
build(0,n-1,0,n-1);
BFS();
return 0 ;
}