题目大意:
已知二叉树的中序和后序序列,求层序序列
输入:
二叉树的中序和后序序列
输出:
二叉树的层序序列
思路:
先把这棵二叉树构造出来,然后用队列求出层序序列,要从中序和后序序列中生成二叉树,先在后序序列中找到第一个根节点(最后一个数字),然后将中序序列分成两部分,以此节点为根节点的左右子树,然后递归求解。
代码:
#include<cstdio>
#include<queue>
using namespace std;
int post[35];
int in[35];
int n;
int number;
struct Node{
int data;
Node *left;
Node *right;
};
queue<Node> q;
Node* getTree(int il,int ir,int pl,int pr)//递归得出这棵二叉树
{
if(il>ir)
{
return NULL;
}
Node *root=new Node;
root->data=post[pr];
int i;
for(i=il;i<=ir;i++)
{
if(in[i]==post[pr])//在中序序列中找到根节点,将中序序列分成左右子树两部分
{
break;
}
}//二叉树分成两部分递归
root->left=getTree(il,i-1,pl,pl+i-il-1);//中序序列中的il到i-1属于左子树,后序序列中的pl到pl+i-il-1属于左子树(i-1-il是第一个节点到最后一个节点的间隔数)
root->right=getTree(i+1,ir,pl+i-il,pr-1);//与上面一个道理
return root;
}
void level(Node *root)
{
q.push((*root));
while(!q.empty())
{
Node temp=q.front();
q.pop();
printf("%d",temp.data);
if(number<n-1)
printf(" ");
if(temp.left!=NULL)
{
q.push((*temp.left));
}
if(temp.right!=NULL)
{
q.push((*temp.right));
}
number++;
}
}
int main()
{
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=getTree(1,n,1,n);
level(root);
}