//判断两棵树是否是同一棵树:先序遍历和中序遍历对应相同或者中序遍历和后序遍历对应相同
//代码思路:两个数组分别存放建好的树的先序遍历以及正序遍历结果,然后对比是否相等
//题目意思 这题是 HDU 3791
题目描述:
判断两序列是否为同一二叉搜索树序列
输入:
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
输出:
如果序列相同则输出YES,否则输出NO
样例输入:
2
567432
543267
576342
0
样例输出:
YES
NO
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
typedef struct TiNode
{
char data;
struct TiNode *left,*right;
}TiNode,*BiTree;
char prearr[15],prearr2[15];
char midarr[15],midarr2[15];
void buildtree(BiTree &T,int x)//建树
{
if(T==NULL)
{
T=(BiTree)malloc(sizeof(BiTree));
T->data=x;
T->left=NULL;
T->right=NULL;
}
else if(x<T->data)
{
buildtree(T->left,x) ;
}
else if(x>T->data)
{
buildtree(T->right,x);
}
}
void Presearch(BiTree T,int &index)//先序遍历
{
prearr[index++]=T->data;
if(T->left!=NULL)
Presearch(T->left,index);
if(T->right!=NULL)
Presearch(T->right,index);
}
void Midsearch(BiTree T, int &index)//中序遍历
{
if(T->left!=NULL)
Midsearch(T->left,index);
midarr[index++]=T->data;
if(T->right!=NULL)
Midsearch(T->right,index);
}
int main()
{
int N,index;
char str[15],str2[15];
while(scanf("%d",&N)!=EOF&&N!=0)
{
BiTree T=NULL;
scanf("%s",str);
for(int k=0;k<strlen(str);k++)
{
buildtree(T,str[k]);//建树
}
index=0;
Presearch(T,index) ;
prearr[index]='\0';
strcpy(prearr2,prearr);
index=0;
Midsearch(T,index);
midarr[index]='\0';
strcpy(midarr2,midarr);
for(int i=0;i<N;i++)
{
T=NULL;
scanf("%s",str2);
for(int g=0;g<strlen(str2);g++)
{
buildtree(T,str2[g]);
}
index=0;
Presearch(T,index);
prearr[index]='\0';
if(strcmp(prearr,prearr2)!=0)
{
printf("NO\n");
continue;
}
index=0;
Midsearch(T,index);
midarr[index]='\0';
if(strcmp(midarr,midarr2)!=0)
{
printf("NO\n");
continue;
}
printf("YES\n");
free(T);
}
}
return 0;
}
//还是这个题意,我们换一种建树方法,这次采用静态建树的方法
#include <iostream>
using namespace std;
#include <cstring>
#define MAX 666
int node[MAX];
int node2[MAX];
void makeTree(char *str,int *node)
{
for(int i=0;str[i]!='\0';i++)
{
int j=0;
int t=str[i]-'0';
while(node[j]!=-1)
{
if(t>node[j])
j=(j+1)*2;
if(t<node[j])
j=(j+1)*2-1;
}
node[j]=t;
}
}
void compare()
{
for(int i=0;i<MAX;i++)
if(node[i]!=node2[i])
{
cout<<"NO"<<endl;
return;
}
cout<<"YES"<<endl;
}
int main()
{
int n;
char str[12],str2[12];
cin>>n;
if(!n)
return 0;
memset(node,-1,sizeof(node));
cin>>str;
makeTree(str,node);
int len=strlen(str);
while(n--)
{
memset(node2,-1,sizeof(node2));
cin>>str2;
int len2=strlen(str2);
if(len!=len2)
{
cout<<"NO"<<endl;
continue;
}
makeTree(str2,node2);
compare();
}
main();
return 0;
}
因篇幅问题不能全部显示,请点此查看更多更全内容