-
题目描述:
-
判断两序列是否为同一二叉搜索树序列
-
输入:
-
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
-
输出:
-
如果序列相同则输出YES,否则输出NO
-
样例输入:
-
2 567432 543267 576342 0
-
样例输出:
-
YES NO
-
来源:
AC代码:
//前序遍历序列和中序遍历序列能唯一确定一个二叉树
//本题关键在于数的构建和遍历
#include<stdio.h>
#include<string.h>
#define N 20
struct Node { //二叉树节点结构体
char id;
Node *lchild;
Node *rchild;
};
Node *nodes[N];
char bst[N], s[N]; //接受输入的字符串
char in1[N], pre1[N], in2[N], pre2[N]; //存放构建好的二叉树的中序和前序遍历序列
int k; //遍历增量
void build(Node *no, Node *root) { //二叉树的构建
if(no->id > root->id) {
if(root->rchild==NULL)
root->rchild = no;
else
build(no,root->rchild);
}
if(no->id < root->id) {
if(root->lchild==NULL)
root->lchild = no;
else
build(no,root->lchild);
}
}
void inOrder(Node *root, char in[]) { //中序遍历
if(root->lchild != NULL)
inOrder(root->lchild,in);
in[k++] = root->id; //将遍历结果存放到数组,方便后面的序列比较
if(root->rchild != NULL)
inOrder(root->rchild,in);
}
void preOrder(Node *root, char pre[]) { //前序遍历
pre[k++] = root->id;
if(root->lchild != NULL)
preOrder(root->lchild,pre);
if(root->rchild != NULL)
preOrder(root->rchild,pre);
}
int main() {
//freopen("in.txt","r",stdin);
int n, i;
while(scanf("%d",&n)!=EOF && n) {
scanf("%s",bst);
int len = strlen(bst);
for(i=0; i<len; i++) {
nodes[i] = new Node(); //new一个节点 将地址赋给结构体指针nodes[i]
nodes[i]->id = bst[i];
nodes[i]->lchild = NULL; //节点左右孩子初始化为空
nodes[i]->rchild = NULL;
}
for(i=1; i<len; i++) //构建二叉树,即将除第一个节点外的节点插入到以其为根的树中
build(nodes[i],nodes[0]);
k=0;
inOrder(nodes[0],in1); //中序遍历
k=0;
preOrder(nodes[0],pre1); //后序遍历
while(n--) {
scanf("%s",s);
for(i=0; i<len; i++) {
nodes[i] = new Node();
nodes[i]->id = s[i];
nodes[i]->lchild = NULL;
nodes[i]->rchild = NULL;
}
for(i=1; i<len; i++)
build(nodes[i],nodes[0]);
k=0;
inOrder(nodes[0],in2);
k=0;
preOrder(nodes[0],pre2);
int flag = 1;
for(i=0; i<len; i++) { //若两棵树的前序中序遍历序列有一个不同,则不匹配
if(in1[i] != in2[i]) {
flag = 0;
break;
}
if(pre1[i] != pre2[i]) {
flag = 0;
break;
}
}
if(flag)
printf("YES\n");
else
printf("NO\n");
}
}
return 0;
}