九度[1009]-二叉搜索树
题目描述:
判断两序列是否为同一二叉搜索树序列
输入
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
输出
如果序列相同则输出YES,否则输出NO
样例输入
2
567432
543267
576342
0
样例输出
YES
NO
解题思路:
1、构造二叉搜索树
2、得到前序遍历序列
3、比较前序遍历序列
两个注意点:见代码注释
AC代码:
#include <cstdio>
#include <cstring>
const int maxn = 20;
int n;
char input[maxn], data[maxn];
int pre1[maxn], pre2[maxn];
struct node{
int data;
node *lchild, *rchild;
};
void insert(node* &p, int data){ // 指针p需要引用
if(p == NULL) {
p = new node;
p->data = data;
p->lchild = p->rchild = NULL;
return;
}
if(p->data == data) return;
else if(p->data < data) insert(p->rchild, data);
else insert(p->lchild, data);
}
node* create(char data[], int len){
node* root = NULL;
for(int i = 0; i < len; i++){
insert(root, data[i]-'0');
}
return root;
}
void clean(node* root){
node *p = root;
if(p->lchild != NULL) clean(p->lchild);
if(p->rchild != NULL) clean(p->rchild);
delete p;
}
void preOrder(node *root, int data[], int *cnt){ // cnt需要使用指针,不然左子树遍历之后,右子树的参数cnt不会改变
if(root == NULL) return;
data[(*cnt)++] = root->data;
if(root->lchild != NULL) preOrder(root->lchild, data, cnt);
if(root->rchild != NULL) preOrder(root->rchild, data, cnt);
}
bool isSame(int a[], int b[], int len){
for(int i = 0; i < len; i++){
if(a[i] != b[i]) return false;
}
return true;
}
int main(){
freopen("C:\\Users\\Administrator\\Desktop\\test.txt", "r", stdin);
while(scanf("%d", &n) != EOF){
if(n == 0) break;
scanf("%s", input);
int len = strlen(input);
node* root1 = create(input, len);
int cnt = 0;
preOrder(root1, pre1, &cnt);
for(int i = 0; i < n; i++){
scanf("%s", data);
cnt = 0;
node* root2 = create(data, len);
preOrder(root2, pre2, &cnt);
if(isSame(pre1, pre2, len)) printf("YES\n");
else printf("NO\n");
clean(root2);
}
clean(root1);
}
fclose(stdin);
return 0;
}