寒假Day30:二叉树的遍历相关题型(求先序或后序、搜索树的判断)
HDU1710 - Binary Tree Traversals
题意:已知前序中序求后序
思路:模板题
AC代码:
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<cmath>
using namespace std;
typedef long long ll;
const int N=1010;
int pre[N],in[N],post[N],id[N],p;
//前序起点、前序终点、中序起点、中序终点
void dfs(int l,int r,int L,int R)
{
int root=id[pre[l]];
int ls=root-L;//中序左子树节点个数
int rs=R-root;//中序右子树节点个数
if(ls)//左子树非空
dfs(l+1,l+root,L,root-1); //dfs(l+1,l+root-1,L,root-1); 也能过
if(rs)//右子树非空
dfs(l+ls+1,r,root+1,R);
post[++p]=pre[l];//当左子树是空的右子树也是空的说明是叶节点、记录即可
}
int main()
{
int n;
while(cin>>n)
{
p=0;
for(int i=1;i<=n;i++)
cin>>pre[i];
for(int i=1;i<=n;i++)
{
cin>>in[i];
id[in[i]]=i;
}
dfs(1,n,1,n);
for(int i=1;i<n;i++)
cout<<post[i]<<" ";
cout<<post[n]<<endl;
}
return 0;
}
计蒜客T2113 - 求先序排列
题意:已知中序后序求先序
思路:模板题
AC代码:
#include<string.h>
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<queue>
#include<map>
#include<cmath>
using namespace std;
#define inf 0x3f3f3f3f
const int N=500200*2;
char s1[10],s2[10];
void w(int l1,int r1,int l2,int r2)
{
int k=-1;
for(int i=l1; i<r1; i++)
{
if(s1[i]==s2[r2-1])
{
printf("%c",s1[i]);
k=i;
break;
}
}
if(k>l1) //左
w(l1,k,l2,k-l1+l2);
if(r1>k+1) //右
w(k+1,r1,k-l1+l2,r2-1);
}
int main()
{
cin>>s1>>s2;
int l1=strlen(s1);
int l2=strlen(s2);
w(0,l1,0,l2);
return 0;
}
HDU3791 - 二叉搜索树
题意:判断两个序列是否能够构成二叉搜索树
思路:利用中序遍历
AC代码:
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
using namespace std;
typedef long long ll;
char a[15],b[15];
bool flag;
struct node
{
int x;// 值
node *l,*r;
};
node *insertt(node *p,int xx)//依次插入每个值
{
if(p==NULL)//如果当前节点为空则插入
{
node *q=new node;//申请一个动态空间
q->x=xx;//赋值
q->l = q->r =NULL;//左右儿子为空
return q;//返回此节点的地址
}
//说明有值,继续往下找,遵循左小右大
if(p->x>xx)//xx<左儿子,继续往左走
p->l=insertt(p->l,xx);
else
p->r=insertt(p->r,xx);
return p;
}
void check(node *root,node *tree)//传入地址
{
if(root!=NULL&&tree!=NULL)//说明此节点两棵树都有值,只需判断值是否相等
{
check(root->l,tree->l);//中序遍历
if(root->x!=tree->x)//判断此节点的值是否和标准树相等
flag=0;
check(root->r,tree->r);
}
else if(root!=NULL||tree!=NULL)//只有一个节点有值
flag=0;
}
int main()
{
int n;
while(~scanf("%d",&n)&&n)
{
node *root=NULL;//标准树地址为空
scanf("%s",a);
int la=strlen(a);
for(int i=0; i<la; i++)
root=insertt(root,a[i]-'0');//构建一颗标准树
for(int i=1; i<=n; i++)
{
flag=1;
node *tree=NULL;//判断树地址为空
scanf("%s",b);
int lb=strlen(b);
for(int i=0; i<lb; i++)
tree=insertt(tree,b[i]-'0');
check(root,tree);
if(flag)
printf("YES\n");
else
printf("NO\n");
}
}
return 0;
}