#include <stdio.h>
#include <string.h>
using namespace std;
struct node{
node *lchild;
node *rchild;
int c;
}tree[100];
char str1[21],str2[21];//分别存放两比较输入的先序+中序序列
int size1,size2;//存放字符串长
char *str;//指向正在输入的字符串
int *size;//计算正在输入字符串长
//str,size与str1 str2,&size1 &size2对应
int loc;
node *creat(){//生成节点
tree[loc].lchild=tree[loc].rchild=NULL;
return &tree[loc++];//返回指针并处理下一节点
}
//递归先序遍历
void preorder(node *tree){
str[(*size)++]=tree->c-'0';//将扫描到的字符转为数字放入str中
if(tree->lchild!=NULL) preorder(tree->lchild);
if(tree->rchild!=NULL) preorder(tree->rchild);
}
//递归中序遍历
void inorder(node *tree){
if(tree->lchild!=NULL) inorder(tree->lchild);
str[(*size)++]=tree->c-'0';
if(tree->rchild!=NULL) inorder(tree->rchild);
}
//递归插入节点
node *insert(node *t,int x){
if(t==NULL){//该节点为空
t=creat();//生成一个新节点存放x
t->c=x;
return t;
}
else if(t->c<x)//插入的值比节点值大,插到右支树
t->rchild=insert(t->rchild,x);
else if(t->c>x)
t->lchild=insert(t->lchild,x);
return t;
}
int main(){
int n;
char tmp[11];
while(scanf("%d",&n)!=EOF&&n!=0){
loc=0;
node *t=NULL;
scanf("%s",tmp);//输入作为比较模板的插入序列
for(int i=0;tmp[i]!=0;i++)//按插入序列插入到二叉树中去
t=insert(t,tmp[i]-'0');
str=str1; //此时str1为正在输入的字符串
size=&size1;//记录str1串长
preorder(t);
inorder(t);
str1[size1]=0;//该字符串的末尾加上结束标志
//处理要比较的输入序列,共n组
while(n--!=0){
loc=0;
t=NULL;
scanf("%s",tmp);//输入作为比较模板的插入序列
for(int i=0;tmp[i]!=0;i++)//按插入序列插入到二叉树中去
t=insert(t,tmp[i]-'0');
str=str2; //此时str1为正在输入的字符串
size=&size2;//记录str1串长
preorder(t);
inorder(t);
str2[size2]=0;//该字符串的末尾加上结束标志
puts(strcmp(str1,str2)==0?"Yes":"No");
}
}
return 0;
}
2
567432
543267
576342
0
- 输入以字符形式转化为数字时,要减去’0’
来源:CSDN
作者:樱谷
链接:https://blog.csdn.net/qq_44249650/article/details/103963526