题目描述
判断两序列是否为同一二叉搜索树序列
输入
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
输出
如果序列相同则输出YES,否则输出NO
样例输入 复制
6
45021
12045
54120
45021
45012
21054
50412
0
样例输出 复制
NO
NO
YES
NO
NO
NO
分析:
本题需要判断两棵搜索二叉树是否一样,由于一棵二叉树由中序序列和先序序列可以确定,而同样类型输入的搜索二叉树的中序序列必然一样,因此只需判断其先序序列是否一致即可。因为需要记录二叉树在先序遍历时访问的结点,因为先序遍历是递归,需要有一种不随递归影响的记录方式,可以使用全局变量或者引用类型等来完成,在这里使用引用类型。
#include <iostream>
#include <string>
using namespace std;
struct node{
char data;
node* lchild, *rchild;
};
void insertTree(node* &root, char e){
if(root == NULL){
root = new node;
root -> data = e;
root ->lchild = root -> rchild = NULL;
return;
}
if(root -> data == e){
return;
}else if(root -> data > e){
insertTree(root -> lchild, e);
}else{
insertTree(root -> rchild, e);
}
}
void Spreorder(node* root, string &s){
if(root == NULL) return;
s += root -> data;
Spreorder(root -> lchild, s);
Spreorder(root -> rchild, s);
}
int main()
{
int n;
string s;
while(cin >> n && n != 0){
cin.get();
node* T = NULL;
getline(cin, s);
for(int i = 0; i < s.size(); i++){
insertTree(T, s[i]);
}
string s1;
Spreorder(T, s1);
for(int i = 0; i < n; i++){
node* T1 = NULL;
getline(cin, s);
for(int i = 0; i < s.size(); i++){
insertTree(T1, s[i]);
}
string temp;
Spreorder(T1, temp);
if(s1 == temp) cout << "YES\n";
else cout << "NO\n";
}
}
return 0;
}