题目:判断两序列是否为同一二叉搜索树
要求:
输入:
判断两序列是否为同一二叉搜索树序列 Input开始一个数n(1<=n<=20) ,表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
输出:
如果序列相同则输出YES,否则输出NO
Sample Input
2
567432
543267
576342
0
Sample Output
YES
NO
#include<string.h>
#include<stdio.h>
struct Node{
Node *lchild;
Node *rchild;
int c;
}Tree[110];
int loc;
Node *creat() { //申请未使用的结点
Tree[loc].lchild == NULL;
Tree[loc].rchild == NULL;
return &Tree[loc++];
}
char str1[25], str2[25]; //保存二叉排序树的遍历结果,
//将每一棵树的前序遍历得到的字符串与中序遍历得到的字符串连接
//得到遍历结果字符串
int size1, size2; //保存在字符数组中的遍历得到字符个数
char *str; //当前正在保存字符串
int *size; //当前正在保存字符串中的个数
void postOrder(Node *T) {
if (T->lchild != NULL)
postOrder(T->lchild);
if (T->rchild != NULL)
postOrder(T->rchild);
str[(*size)++] = T->c + '0'; //将结点中的字符放入正在保存的字符串中
}
void inOrder(Node *T) {
if (T->lchild != NULL)
inOrder(T->lchild);
str[(*size)++] = T->c + '0';
if (T->rchild != NULL)
inOrder(T->rchild);
}
void preOrder(Node *T) {
str[(*size)++] = T->c + '0';
if (T->lchild != NULL)
preOrder(T->lchild);
if (T->rchild != NULL)
preOrder(T->rchild);
}
Node *Insert(Node *T, int x) { //插入数字
if (T == NULL) { //若当前树为空
T = creat(); //建立结点
T->c = x; //数字直接插入其根结点
return T; //返回根结点指针
}
else if (x < T->c) //若x小于根结点数值
T->lchild = Insert(T->lchild, x);//插入到左子树上
else if (x > T->c)
T->rchild = Insert(T->rchild, x);
return T;
}
int main() {
int n;
char tmp[12];
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');//按顺序将数字插入二叉排序树
}
size1 = 0; //保存在第一个字符串中的字符初始化为0
str = str1; //将正在保存字符串设定为第一个字符串
size = &size1;
preOrder(T);
inOrder(T);
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;
size = &size2;
preOrder(T2);
inOrder(T2);
str2[size2] = 0;
puts(strcmp(str1, str2) == 0 ? "YES" : "NO");
}
}
return 0;
}