关键字:二叉搜索树建树;判断两棵二叉搜索树是否一致:可以通过判断前序遍历序列是否一致(前序、中序序列能确定唯一一棵二叉树,而相同元素的二叉搜索树的中序序列一致)
题目描述
判断两序列是否为同一二叉搜索树序列
输入描述:
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
输出描述:
如果序列相同则输出YES,否则输出NO
示例1
输入
2
567432
543267
576342
0
输出
YES
NO
代码:
#include <iostream>
#include <fstream>
#include <cmath>
#include <cstdlib>
#include <string>
#include <cstring>
using namespace std;
int idx;
struct BTNode{
char data;
struct BTNode *lchild, *rchild;
};
void insertNode(BTNode **root, int x){
if(!(*root)){
(*root) = (BTNode*)malloc(sizeof(BTNode));
(*root)->data = x;
(*root)->lchild = (*root)->rchild = NULL;
return ;
}
if((*root)->data == x) return ;
if(x < (*root)->data){
insertNode(&(*root)->lchild, x);
}
else{
insertNode(&(*root)->rchild, x);
}
}
void PreOrderTraverse(BTNode *root, char* c){
if(!root) return ;
c[idx++] = root->data;
PreOrderTraverse(root->lchild, c);
PreOrderTraverse(root->rchild, c);
}
int main(){
// freopen("a.txt", "r", stdin);
int n;
string s1, s2;
BTNode *root1, *root2;
int len;
while(cin >> n && n != 0){
char t1[11] = {0}, t2[11] = {0};
root1 = root2 = NULL;
getchar();
getline(cin, s1);
len = s1.length();
for(int i = 0; i < len; ++i){
insertNode(&root1, s1[i]);
}
idx = 0;
PreOrderTraverse(root1, t1);
for(int i = 0; i < n; ++i){
root2 = NULL;
getline(cin, s2);
for(int i = 0; i < len; ++i){
insertNode(&root2, s2[i]);
}
idx = 0;
PreOrderTraverse(root2, t2);
puts(strcmp(t1, t2) == 0 ? "YES" : "NO");
}
}
return 0;
}