题目描述:
判断两序列是否为同一二叉搜索树序列
输入:
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
输出:
如果序列相同则输出YES,否则输出NO
样例输入:
2
567432
543267
576342
0
输出:
YES
NO
来源:
2010年浙江大学计算机及软件工程研究生机试真题
解题思路: 用输入的数字构建二叉搜索树,并对该树进行前序和中序的遍历,依次比较两次遍历的结果是否相同,若相同则说明两棵树完全相同。
#include<bits/stdc++.h>
using namespace std;
struct Node{
Node *lchild;
Node *rchild;
int data;
}Tree[21];
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){
str[(*size)++] = T->data + '0';
preOrder(T->lchild);
preOrder(T->rchild);
}
}
void inOrder(Node *T){//中序
if(T){
inOrder(T->lchild);
str[(*size)++] = T->data + '0';
inOrder(T->rchild);
}
}
Node *Insert(Node *T, int x){//将数字插入二叉树
if(T==NULL){
T = creat();
T->data = x;
return T;
}
else if(x<T->data) T->lchild = Insert(T->lchild, x);
else if(x>T->data) 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; //将正在保存字符串中的字符个数指针指向size1
preOrder(T);//前序遍历
inOrder(T);//中序遍历
str1[size1] = 0; //向第一个字符串的最后一个字符后添加空字符,方便使用字符串函数
while(n--) {//输入n个其他字符串
scanf("%s", tmp);//输入
Node *T2 = NULL;
for(int i=0; tmp[i]!=0; i++){//建立二叉排序树
T2 = Insert(T2, tmp[i] - '0');
}
size2 = 0;//第二个字符串保存字符初始化为0
str = str2;//将正在保存的字符串设定为第二个字符串
size = &size2;//正在保存字符串中字符数量指针指向size2
preOrder(T2);//前序遍历
inOrder(T2);//中序遍历
str2[size2] = 0;//字符串最后添加空字符
puts(strcmp(str1,str2)==0?"YES":"NO");//比较两个遍历字符串,若相同则输出YES,否则输出NO
}
}
return 0;
}