-
题目描述:
-
判断两序列是否为同一二叉搜索树序列
-
输入:
-
开始一个数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>
struct Node {
Node *lchild;
Node *rchild;
char c;
}Tree[20];
int loc;
char *s;
int cnt;
void preOrder(Node *T) {
s[cnt++] = T->c;
if(T->lchild!=NULL)
preOrder(T->lchild);
if(T->rchild!=NULL)
preOrder(T->rchild);
}
void inOrder(Node *T) {
if(T->lchild!=NULL)
inOrder(T->lchild);
s[cnt++] = T->c;
if(T->rchild!=NULL)
inOrder(T->rchild);
}
Node *create() {
Tree[loc].lchild = Tree[loc].rchild = NULL;
return &Tree[loc++];
}
Node *insert(Node *T, char x) {
if(T==NULL) {
T = create();
T->c = x;
return T;
}
else if(T->c > x)
T->lchild = insert(T->lchild,x);
else if(T->c < x)
T->rchild = insert(T->rchild,x);
return T;
}
int main() {
int n,i,j;
while(scanf("%d",&n)!=EOF) {
if(n==0) break;
char s1[30];
scanf("%s",s1);
loc = 0;
Node *T = NULL;
cnt = 0;
s = s1;
for(j=0;s1[j]!=0;j++)
T = insert(T,s1[j]);
preOrder(T);
inOrder(T);
s1[cnt] = 0;
for(i=0;i<n;i++) {
char s2[30];
scanf("%s",s2);
loc = 0;
Node *T = NULL;
cnt = 0;
s = s2;
for(j=0;s2[j]!=0;j++)
T = insert(T,s2[j]);
preOrder(T);
inOrder(T);
s2[cnt] = 0;
puts(strcmp(s1,s2)==0 ? "YES" : "NO");
}
}
return 0;
}
二叉搜索树 == 二叉查找树 == 二叉排序树
判断俩棵树是否相同,不能仅仅用某一种遍历方法去遍历来判断。两组数据相同,插入顺序不同的两棵二叉排序树,
他们的中序遍历一定是一样的,但他们不是同一棵树。
因此包括中序遍历在内的两种遍历结果可以唯一确定一棵树。(必须包括中序,因为先中,后中 两种才能唯一确定一棵树)
本题中,将先序遍历和中序遍历结果都同时存储在一个数组中(最后要置0,成为c风格字符串),最后根据俩数组是否
相等,得出是否能组成同一棵二叉搜索树。