这是一道先序遍历求祖先的题目,把案例画一下草图就知道求解原理了。
废话不多说,直接上代码:
#include<iostream>
#include<vector>
#include<map>
using namespace std;
map<int,bool> preorder; //利用map判断值是否在遍历序列中
int main(){
int m,n,u,v;
cin >> m >> n;
vector<int> pre(n);
for(int i = 0;i < n;i++){
cin >> pre[i];
preorder[pre[i]] = true; //在序列中则为true
}
for(int i = 0;i < m;i++){
cin >> u >> v;
if(preorder[u] == false && preorder[v] == false) //判断是否在遍历序列中
printf("ERROR: %d and %d are not found.\n",u,v);
else if(preorder[u] == false || preorder[v] == false) //判断是否在遍历序列中
printf("ERROR: %d is not found.\n",preorder[u] == false ? u:v);
else{
for(int j = 0;j < n;j++){
if((pre[j] >= u && pre[j] <= v) || (pre[j] <= u && pre[j] >= v)){
if(pre[j] != u && pre[j] != v){
printf("LCA of %d and %d is %d.\n",u,v,pre[j]);
break; //必须break循环哦,哈哈哈
}
else{
printf("%d is an ancestor of %d.\n",pre[j],pre[j] == u ? v:u);
break; //这里也得break掉哦~
}
}
}
}
}
return 0;
}
备注:本题也曾考虑使用迭代器解决,但是map(自动排序) 和unordered_map(测试发现,虽然没有自动排序,但是会发生倒序) 的迭代器都不能简单地解题,就pass了……