-
题目描述:
-
判断两序列是否为同一二叉搜索树序列
-
输入:
-
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
-
输出:
-
如果序列相同则输出YES,否则输出NO
-
样例输入:
-
2 567432 543267 576342 0
-
样例输出:
-
YES NO
-
来源:
//
//
#include "stdafx.h"
#include <string.h>
struct Node
{ Node *lchild;
Node *rchild;
int c;
}Tree[110];
int loc;
Node *creat(){
Tree[loc].lchild=Tree[loc].rchild=NULL;
return &Tree[loc++];//用返回的形式为指针分配空间
}
char str1[25],str2[25];
int size1,size2;
char *str; //当前正在保存字符串
int *size; //当前正在保存字符串中字符的个数
void preOrder(Node *T){
if(T->lchild!=NULL) preOrder(T->lchild);
if(T->rchild!=NULL) preOrder(T->rchild);
str[(*size)++]=T->c+'0';//将节点中的字符放在正在保存的字符串中;
}
void inOreder(Node *T)
{ if(T->lchild!=NULL) inOreder(T->lchild);
str[(*size)++]=T->c+'0';
if(T->rchild!=NULL) inOreder(T->rchild);
}
Node *Insert(Node *T,int x){
if(T==NULL){
T=creat();
T->c=x;return T;
}
else if(x<T->c) T->lchild=Insert(T->lchild,x);
else if(x>T->c) T->rchild=Insert(T->rchild,x);
return T;
}
int _tmain(int argc, _TCHAR* argv[])
{int n;
char tmp[12];
while (scanf("%d",&n)&&n!=0)
{
loc=0;
Node *T=NULL;
scanf("%s",tmp);
for (int i = 0; tmp[i]!=0; i++)
{
T=Insert(T,tmp[i]-'0');
}
size1=0;//保存在第一个字符串中的字符初始化为0
str=str1;//将正在保存字符串设定为第一个字符串
size=&size1;//将正在保存字符串的字符个数指针指向size1
preOrder(T);
inOreder(T);//经过遍历函数,将遍历序列存储到了数组str1中,通过改变指针指向的数据实现的
str1[size1]=0;
while(n--!=0){//相同的模式,遍历其他的字符串
scanf("%s",tmp);
Node *T2=NULL;
for (int i = 0; tmp[i] !=0; i++)
{ T2=Insert(T2,tmp[i]-'0');}
size2=0;
str=str2;//这里改变了str的指向,与str2的指向相同
size=&size2;//与上同,将下标的指向改变
preOrder(T2);
inOreder(T2);
str2[size2]=0;
puts(strcmp(str1,str2)?"NO":"YES");
}
}
return 0;
}