Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and inorder traversal sequences, you are supposed to output the level order traversal sequence of the corresponding binary tree.
Input Specification:
Each input file contains one test case. For each case, the first line gives a positive integer N(≤30), the total number of nodes in the binary tree. The second line gives the postorder sequence and the third line gives the inorder sequence. All the numbers in a line are separated by a space.
Output Specification:
For each test case, print in one line the level order traversal sequence of the corresponding binary tree. All the numbers in a line must be separated by exactly one space, and there must be no extra space at the end of the line.
Sample Input:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
Sample Output:
4 1 6 3 5 7 2
题目大意:给你n个结点,第二行给出后序遍历的序列,第三行给出中序遍历的序列,让你根据这两个序列构造一个二叉树,然后把该二叉树的层序遍历序列输出,注意最后不能有多余的空格。
心得:此题和给你先序遍历序列和中序遍历序列的写法一样,只不过根据序列的特点,在进行左右子树递归时需要进行地址的相应变化。如果给你中序序列和先序序列、后序序列、层序序列中的一个序列都可以建树。但是如果没有中序序列无论给你多少序列都不可能建成二叉树。
accept code:
#include <iostream>
#include <queue>
using namespace std;
int n;//结点数
int pos[35],in[35];
struct node{
int data;
node* lchild;
node* rchild;
};
node* create(int posl,int posr,int inl,int inr)//构造二叉树
{
if(posl>posr)//当后序序列长度小于0时递归结束
return NULL;
node* root=new node;
root->data=pos[posr];
int k;
for(k=inl;k<=inr;k++)
{
if(in[k]==pos[posr])//在中序序列中找出与后序序列中根结点相同的结点,以便于判断左右子树
break;
}
int numleft=k-inl;//结点个数
root->lchild=create(posl,posl+numleft-1,inl,k-1);//根据后序和中序序列的特点推出下一次遍历的结点的地址
root->rchild=create(posl+numleft,posr-1,k+1,inr);
return root;
}
void lineorder(node* root)//层序遍历函数
{
queue<node*> q;
q.push(root);
int count=1;
while(!q.empty())
{
node* now=q.front();
q.pop();
if(count<n)
printf("%d ",now->data);
else
printf("%d",now->data);
if(now->lchild!=NULL)
q.push(now->lchild);
if(now->rchild!=NULL)
q.push(now->rchild);
count++;
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>pos[i];
for(int j=1;j<=n;j++)
cin>>in[j];
node* root=create(1,n,1,n);
lineorder(root);
return 0;
}