题意分析:
(1)这是很数据结构中很经典的一类题型,给出中序序列和先序或者后序序列中的一种,求另外另类序列。一般若是求层序,需要构建二叉树,如果不是,可以不用建树;
(2)建树的过程是一个递归的过程,最后按层次遍历打印
可能坑点:
(1)建树的时候大多数人可能坑在不知道应该如何传根节点的指针。其实很简单,因为需要建树,调用建树操作一定是最后影响到这个指针的,所以一定要使用引用
#include <iostream>
#include <stdlib.h>
#include <queue>
using namespace std;
struct TreeNode
{
int value;
struct TreeNode* lchild;
struct TreeNode* rchild;
};
void BuildTree(TreeNode *&root,int postorder[],int inorder[],int post_low,int post_high,int in_low,int in_high)
{
int i;
if(postorder==NULL)return;
if(post_low>post_high||in_low>in_high)
{
root=NULL;
}
else
{
root=(TreeNode*)malloc(sizeof(TreeNode));//初始化一个原来的指针
root->value=postorder[post_high];
for(i=in_low;i<=in_high;i++)
{
if(inorder[i]==postorder[post_high])
{
BuildTree(root->lchild,postorder,inorder,post_low,post_low+(i-in_low)-1,in_low,i-1);
BuildTree(root->rchild,postorder,inorder,post_low+i-in_low,post_high-1,i+1,in_high);
break;
}
}
}
}
queue<TreeNode* >qu;
int first=1;
void printLevelOrder(TreeNode *root)
{
if(root!=NULL)
{
qu.push(root);
}
TreeNode *temp;
while(!qu.empty())
{
temp=qu.front();
if(first)first=0;
else cout<<" ";
cout<<temp->value;
qu.pop();
if(temp->lchild!=NULL)qu.push(temp->lchild);
if(temp->rchild!=NULL)qu.push(temp->rchild);
}
}
int main()
{
int N;
cin>>N;
const int num=N;
int post[num];
int in[num];
int i=0,j=0;
while(i<N)cin>>post[i++];
while(j<N)cin>>in[j++];
TreeNode *root;
BuildTree(root,post,in,0,N-1,0,N-1);
printLevelOrder(root);
return 0;
}