您的位置:首页 > 其它

SDUT 1489 已知中序后序二叉树的先序,深度

2015-10-30 21:08 429 查看

求二叉树的先序遍历


Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^

题目描述

已知一棵二叉树的中序遍历和后序遍历,求二叉树的先序遍历

输入

输入数据有多组,第一行是一个整数t (t<1000),代表有t组测试数据。每组包括两个长度小于50 的字符串,第一个字符串表示二叉树的中序遍历序列,第二个字符串表示二叉树的后序遍历序列。

输出

输出二叉树的先序遍历序列

示例输入

2
dbgeafc
dgebfca
lnixu
linux


示例输出

abdegcf
xnliu


提示

来源

GYX

示例程序

#include<bits/stdc++.h>
using namespace std;
char s[100];
char s1[100],s2[100];
struct node
{
char c;
node *lnext,*rnext;
}*root;
node* Creat()
{
node *p=new node;
p->lnext=NULL;
p->rnext=NULL;
return p;
}
node * Build(node* p,int l,int r,int ind) //要有返回值
{
int i;
int flag=0;
for(i=l;i<=r;i++)
{
if(s1[i]==s2[ind])
{
flag=1;
break;
}
}
if(flag==0)   //防止找到最后了
return 0;
p=Creat();
p->c=s1[i];
p->lnext=Build(p->lnext,l,i-1,ind-1-(r-i)); //左子树
p->rnext=Build(p->rnext,i+1,r,ind-1);  //右子树
return p;
}
int Front(node *p)
{
if(p)
{
printf("%c",p->c);
Front(p->lnext);
Front(p->rnext);
}
}
int main()
{
int T;
while(~scanf("%d",&T))
{
while(T--)
{
scanf("%s%s",s1,s2);
int len=strlen(s1);
root=Creat();
root=Build(root,0,len-1,len-1);
Front(root);
printf("\n");
}
}
}
#include<bits/stdc++.h>//求深度
using namespace std;
char s[100];
char s1[100],s2[100];
int Max;
struct node
{
char c;
node *lnext,*rnext;
}*root;
node* Creat()
{
node *p=new node;
p->lnext=NULL;
p->rnext=NULL;
return p;
}
node* Build(node* p,int l,int r,int ind)
{
int i;
int flag=0;
for(i=l;i<=r;i++)
{
if(s1[i]==s2[ind])
{
flag=1;
break;
}
}
if(flag==0)
return 0;
p=Creat();
p->c=s1[i];
p->lnext=Build(p->lnext,l,i-1,ind-1-(r-i));
p->rnext=Build(p->rnext,i+1,r,ind-1);
return p;
}
int Front(node *p,int ans)
{
if(!p)
return 0;
if(Max<ans)
Max=ans;
if(p)
{
//printf("%c",p->c);
Front(p->lnext,ans+1);
Front(p->rnext,ans+1);
}
}
int main()
{
int T;
while(~scanf("%d",&T))
{
while(T--)
{
Max=-1;
scanf("%s%s",s1,s2);
int len=strlen(s1);
root=Creat();
root=Build(root,0,len-1,len-1);
Front(root,1);
cout<<Max<<endl;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: