已知树的后序遍历和中序遍历求树的先序遍历
#include<stdio.h>
#include<string.h>
using namespace std;
const int maxn = 100;
void getpre(int *post,int *in,int n)
{
if(n<=0)return;
int root = post[n-1];
int k;
for(int i=0; i<n; i++)
{
if(in[i]==root)
{
k=i;
break;
}
}
printf("%d ",root);
getpre(post,in,k);
getpre(post+k,in+k+1,n-k-1);
}
int main()
{
int post[maxn],in[maxn];
int n;
while(~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]);
getpre(post,in,n);
printf("\n");
}
return 0;
}
已知树的后序遍历和中序遍历求树的层次遍历
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
const int maxn = 100;
struct node
{
int x;
node *l,*r;
};
node* getpre(int *post,int *in,int n)
{
node *head;
if(n<=0)return NULL;
head = new node;
int root = post[n-1];
head->x = root;
int k;
for(int i=0; i<n; i++)
{
if(in[i]==root)
{
k=i;
break;
}
}
head->l = getpre(post,in,k);
head->r = getpre(post+k,in+k+1,n-k-1);
return head;
}
queue<node*>Q;
void bfs(node *head)
{
while(!Q.empty())
{
Q.pop();
}
Q.push(head);
node *tmp;
int first = 1;
while(!Q.empty())
{
tmp = Q.front();
Q.pop();
if(first)
{
first = 0;
}
else
printf(" ");
printf("%d",tmp->x);
if(tmp->l)
Q.push(tmp->l);
if(tmp->r)
Q.push(tmp->r);
}
printf("\n");
}
int main()
{
int post[maxn],in[maxn];
int n;
while(~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 *head = getpre(post,in,n);
bfs(head);
}
return 0;
}