给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。
输入格式:
输入包含若干组测试数据。每组数据的第1行给出两个正整数N (≤10)和L,分别是每个序列插入元素的个数和需要检查的序列个数。第2行给出N个以空格分隔的正整数,作为初始插入序列。最后L行,每行给出N个插入的元素,属于L个需要检查的序列。
简单起见,我们保证每个插入序列都是1到N的一个排列。当读到N为0时,标志输入结束,这组数据不要处理。
输出格式:
对每一组需要检查的序列,如果其生成的二叉搜索树跟对应的初始序列生成的一样,输出“Yes”,否则输出“No”。
输入样例:
4 2
3 1 4 2
3 4 1 2
3 2 4 1
2 1
2 1
1 2
0
输出样例:
Yes
No
No
思路
我们通过lchi, rchi存储一个节点的左右子节点,
通过原始插入顺序建树,然后我们通过dfs方法得到原始树的先序遍历序列sequence1
然后再通过不同的插入顺序建树并调用dfs方法得到树的先序遍历序列sequence2
比较sequence1和sequence2即可得到结果
#include<bits/stdc++.h>
using namespace std;
const int inf = 1005;
int n;
int l;
int lchi[inf];
int rchi[inf];
void build(int u, int v) {
if(v < u) {
if(lchi[u] != 0) {
build(lchi[u], v);
} else {
lchi[u] = v;
}
}
if(v > u) {
if(rchi[u] != 0) {
build(rchi[u], v);
} else {
rchi[u] = v;
}
}
}
void dfs(int u, string &sequence) {
if(u != 0) {
sequence += u + '0';
} else {
return;
}
dfs(lchi[u], sequence);
dfs(rchi[u], sequence);
}
int main(){
while(scanf("%d %d", &n, &l) == 2 && n) {
string sequence1;
string sequence2;
for(int i=0; i<=l; i++) {
sequence2.clear();
fill(lchi, lchi + inf, 0);
fill(rchi, rchi + inf, 0);
int u;
cin >> u;
for(int j=1; j<n; j++) {
int v;
cin >> v;
build(u,v);
}
if(!i) {
dfs(u, sequence1);
continue;
} else {
dfs(u, sequence2);
}
if(sequence1 == sequence2) {
cout << "Yes\n";
} else {
cout << "No\n";
}
}
}
}