题意:给出一棵二叉树的后序遍历序列和中序遍历序列,求这棵二叉树的层次遍历序列
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct node
{
int data;
node *lch;
node *rch;
};
const int N=50;
int pre[N],in[N],post[N];
int n;
node *create(int postL,int postR,int inL,int inR) //根据后序和中序建树
{
if(postL>postR) return NULL;
node *root=new node;
root->data=post[postR];
int k;
for(k=inL;k<=inR;++k)
{
if(in[k]==post[postR])
break;
}
int numLeft=k-inL; //左子树的节点个数
root->lch=create(postL,postL+numLeft-1,inL,k-1);
root->rch=create(postL+numLeft,postR-1,k+1,inR);
return root;
}
int num=0;
void layerTranverse(node *root)
{
queue<node*>q;
q.push(root);
while(!q.empty())
{
node* tmp=q.front();
q.pop();
if(num) printf(" ");
printf("%d",tmp->data);
num++;
if(tmp->lch!=NULL) q.push(tmp->lch);
if(tmp->rch!=NULL) q.push(tmp->rch);
}
}
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;++i) scanf("%d",&post[i]);
for(int i=0;i<n;++i) scanf("%d",&in[i]);
node *root=create(0,n-1,0,n-1);
layerTranverse(root);
return 0;
}
GPLT 玩转二叉树
题意:给出中序和前序,要求输出镜像树的层次遍历
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct node
{
int data;
node *lch;
node *rch;
};
const int N=50;
int pre[N],in[N];
int n;
node* create(int preL,int preR,int inL,int inR)
{
if(preL>preR) return NULL;
node* root=new node;
root->data=pre[preL];
int k;
for( k=inL;k<=inR;++k)
if(in[k]==pre[preL])
break;
int numLeft=k-inL;
root->lch=create(preL+numLeft+1,preR,k+1,inR); //直接建立镜像树,注意这里交换左右孩子
root->rch=create(preL+1,preL+numLeft,inL,k-1);
return root;
}
void bfs(node* root)
{
queue<node*>q;
q.push(root);
int num=0;
while(!q.empty())
{
node* tmp=q.front();
q.pop();
if(num) printf(" ");
printf("%d",tmp->data);
num++;
if(tmp->lch!=NULL) q.push(tmp->lch);
if(tmp->rch!=NULL) q.push(tmp->rch);
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%d",&in[i]);
for(int i=1;i<=n;++i)
scanf("%d",&pre[i]);
node* root=create(1,n,1,n);
bfs(root);
return 0;
}