给定一个BST的先序遍历序列和m个数值对,求每个数值对的深度最大的公共父节点。
可以不建树,顺序查找先序遍历的那个数组。查找值是否存在树中,若两个都存在则开始查找,不存在则输出不存在。先序遍历中根节点总是最先访问,因此顺序查找序列中最先满足val1<currval<val2或val1>currval>val2的currval就是LCA。当currval和val1或val2其中一个相等时,输出和currval相等的那个节点为另一节点的父节点。
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
int m,n;
int arr[10010];
void findAnc(int val1,int val2){
for(int i=0;i<n;i++){
int currval=arr[i];
if((currval>val1 && currval>val2)||(currval>val1 && currval>val2))continue;
else if(val1==currval){
printf("%d is an ancestor of %d.\n",val1,val2);
return;
}else if(val2==currval){
printf("%d is an ancestor of %d.\n",val2,val1);
return;
}else if((val1>currval && val2<currval) || (val1<currval && val2>currval)){
printf("LCA of %d and %d is %d.\n",val1,val2,currval);
return;
}
}
}
int main(){
scanf("%d%d",&m,&n);
for(int i=0;i<n;i++){
scanf("%d",&arr[i]);
}
for(int i=0;i<m;i++){
int key1,key2;
scanf("%d %d",&key1,&key2);
bool have1=!(find(arr,arr+n,key1)==arr+n);
bool have2=!(find(arr,arr+n,key2)==arr+n);
if(!have1 && !have2)printf("ERROR: %d and %d are not found.\n",key1,key2);
else if(!have2)printf("ERROR: %d is not found.\n",key2);
else if(!have1)printf("ERROR: %d is not found.\n",key1);
else{
findAnc(key1,key2);
}
}
}