1、前序+中序—>树
这个天勤《高分笔记》树那章的真题仿造上就有
核心代码如下:
S->lchild=CreateBT(pre,in,l1+i,l1+i-l2,l2,i-1);
S->rchild=CreateBT(per,in,l1+i-l2+1,r1,i+1,r2);
例:
前序:1 3 5 2 4 6 7
中序:5 3 2 1 4 6 7
i
要注意的是:一开始S->lchild中的前序尾部r1会等于i,S->rchild中前序首部l1会等于i+1。但是不能这样带人递归,因为一开始l1==l2,一次递归后两者就可能不相等了。
1086. Tree Traversals Again
http://www.patest.cn/contests/pat-a-practise/1086
#include <stdio.h>
#include <string.h>
struct Node
{
Node* lchild;
Node* rchild;
int val;
}Tree[31];
int loc;
Node* create()
{
Tree[loc].lchild=Tree[loc].rchild=NULL;
return &Tree[loc++];
}
Node* build(int pre[],int in[],int l1,int r1,int l2,int r2)
{
if(l1<=r1)
{
Node* T=create();
int i=l2;
while(pre[l1]!=in[i])
i++;
T->val=in[i];
T->lchild=build(pre,in,l1+1,l1+i-l2,l2,i-1);
T->rchild=build(pre,in,l1+i-l2+1,r1,i+1,r2);
return T;
}
else return NULL;
}
void postorder(int post[],Node* T)
{
if(T!=NULL)
{
postorder(post,T->lchild);
postorder(post,T->rchild);
post[loc++]=T->val;
}
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
//其实这题就是给出 先序 和 中序 求 后序
//push 的次序就是 先序,pop出来的次序 就是 中序
int pre[31];
int in[31];
int post[31];
int Stack[31];
int top=0,loc1=0,loc2=0;
int i;char s[10];int temp;
for(i=0;i<2*n;i++)
{
getchar();
scanf("%s",s);
if(strcmp(s,"Push")==0)
{
scanf("%d",&temp);
pre[loc1++]=temp;
Stack[top++]=temp;
}
else
in[loc2++]=Stack[--top];
}
//建树
int l1=0,l2=0,r1=n-1,r2=n-1;
loc=0;
Node* T=build(pre,in,l1,r1,l2,r2);
loc=0;
postorder(post,T);
for(i=0;i<n;i++)
printf("%d%c",post[i],i==n-1?' ':' ');
}
}
2、后序+中序—>树
浙大 Graduate Entrance Exam 2011-2 上有一题目,就是给出后序 和 中序 遍历,求 层次遍历。
可以先根据后序和前序遍历,生成树,返回根节点,在进行层次遍历。
Tree Traversals (25)
http://www.patest.cn/contests/pat-a-practise/1020
#include <iostream>
using namespace std;
struct LNode
{
LNode *lchild,*rchild;
int data;
};
int in[31];
int pos[31];
LNode* fun(int pos[],int f1,int r1,int in[],int f2,int r2)//建树
{
if(f1>r1) return NULL;
LNode *p=(LNode*)malloc(sizeof(LNode));
p->lchild=NULL;
p->rchild=NULL;
p->data=pos[r1];
int i;
for(i=f2;i<=r2;i++)
if(in[i]==pos[r1]) break;
p->lchild=fun(pos,f1,f1+i-f2-1,in,f2,i-1);
p->rchild=fun(pos,f1+i-f2,r1-1,in,i+1,r2);
return p;
}
int main()
{
int n;
while(cin>>n)
{
int i;
for(i=0;i<n;i++)
cin>>pos[i];
for(i=0;i<n;i++)
cin>>in[i];
LNode *q=(LNode*)malloc(sizeof(LNode));
q=fun(pos,0,n-1,in,0,n-1);
LNode* que[40]; //层次遍历
int front=0;int rear=0;
rear++;
que[rear]=q;
bool fir=true;
while(front!=rear)
{
front++;
if(fir)
{cout<<que[front]->data;fir=false;}
else cout<<" "<<que[front]->data;
if(que[front]->lchild!=NULL)
que[++rear]=que[front]->lchild;
if(que[front]->rchild!=NULL)
que[++rear]=que[front]->rchild;
}
cout<<endl;
}
return 0;
}