已知二叉树后序和中序,求层次顺序。需要重点参考。
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
struct node
{
int value;
node *left,*right;
};
vector<int> inOrder,post,ans;
queue<node *> outOrder;
node * getParent(int start,int end)
{
int i,index=-1;
node *pa=new node;
pa->left=NULL;
pa->right=NULL;
pa->value=post[post.size()-1];//找到后序中的根结点
for(i=start;i<=end;i++){
if(pa->value==inOrder[i]){//找到根结点对应的中序下标
index=i;
break;
}
}
if(index==end){ //处理右结点的情况
pa->right=NULL;
} else if(index<end){
post.pop_back();
pa->right=getParent(index+1,end);
}
if(index==start){ //处理左结点的情况
pa->left=NULL;
} else if(index>start){
post.pop_back();
pa->left=getParent(start,index-1);
}
return pa;
}
void printLevelOrder(node *p)//层次遍历,借助队列outOrder
{
outOrder.push(p);
while(outOrder.size()>0){
node* t=outOrder.front();
outOrder.pop();
ans.push_back(t->value);
if(t->left!=NULL)
outOrder.push(t->left);
if(t->right!=NULL)
outOrder.push(t->right);
}
}
int main()
{
int n,i,temp;
node *parent;
freopen("C:\\Documents and Settings\\Administrator\\桌面\\input.txt","r",stdin);
cin>>n;
for(i=0;i<n;i++){
cin>>temp;
post.push_back(temp);
}
for(i=0;i<n;i++){
cin>>temp;
inOrder.push_back(temp);
}
parent=getParent(0,n-1);
printLevelOrder(parent);
for(i=0;i<ans.size();i++){
cout<<ans[i];
if(i!=ans.size()-1)
cout<<" ";
}
return 0;
}