题目描述
链接
给出一棵二叉搜索树的前序遍历,问结点u和v的共同最低祖先是谁
分析
- 二叉搜索树的中序遍历是将结点排序后的顺序,现在又给了前序,此时可以唯一确定出二叉搜索树
- 二叉搜索树的性质是左边的比a小,右边的比a大,此时说明a是左右子树的祖先,但不一定是最近
- 前序遍历的话是LDR,map<int, bool> mp用来标记树中所有出现过的结点,遍历一遍pre数组,将当前结点标记为a,如果u和v分别在a的左、右,或者u、v其中一个就是当前a,即(a >= u && a <= v) || (a >= v && a <= u),说明找到了这个共同最低祖先a,退出当前循环!!!!
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e4+10;
int pre[maxn], m, n, u, v, a;
map<int, bool> mp;
int main(){
scanf("%d%d",&m,&n);
for(int i=0;i<n;i++){
scanf("%d",&pre[i]);
mp[pre[i]] = true;
}
for(int i=0;i<m;i++){
scanf("%d%d",&u,&v);
for(int j=0;j<n;j++){
a = pre[j];
if(a>=u && a<=v || a<=u && a>=v) break;
}
if(mp[u] == false && mp[v] == false){
printf("ERROR: %d and %d are not found.
", u, v);
}else if(mp[u] == false){
printf("ERROR: %d is not found.
", u);
}else if(mp[v] == false){
printf("ERROR: %d is not found.
", v);
}else{
if(a == u || a == v){
printf("%d is an ancestor of %d.
", a==u?u:v, a==u?v:u);
}else{
printf("LCA of %d and %d is %d.
", u,v,a);
}
}
}
}