一、题目描述
Input Specification:
Output Specification:
Sample Input:
6 8
6 3 1 2 5 4 8 7
2 5
8 7
1 9
12 -3
0 8
99 99
Sample Output:
LCA of 2 and 5 is 3.
8 is an ancestor of 7.
ERROR: 9 is not found.
ERROR: 12 and -3 are not found.
ERROR: 0 is not found.
ERROR: 99 and 99 are not found.
二、解题思路
对于BST的LCA,有一个有趣的结论是可以记一下的,就是先序遍历中的第一个在这两个数的范围之间的数就是它们的LCA,根据这个结论,代码就很容易写了。
三、AC代码
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> tree;
int main()
{
int M, N, tmp;
scanf("%d%d", &M, &N);
for(int i=0; i<N; i++)
{
scanf("%d", &tmp);
tree.push_back(tmp);
}
int a, b, sze = tree.size();
for(int i=0; i<M; i++)
{
bool ina = false, inb = false;
scanf("%d%d", &a, &b);
for(int k=0; k<sze; k++)
{
if(tree[k] == a) ina = true;
if(tree[k] == b) inb = true;
}
if(ina && inb)
{
for(int j=0; j<sze; j++)
{
if(tree[j] >= min(a, b) && tree[j] <= max(a, b))
{
if(tree[j] == max(a, b))
{
printf("%d is an ancestor of %d.\n", max(a, b), min(a, b));
break;
}
else if(tree[j] == min(a, b))
{
printf("%d is an ancestor of %d.\n", min(a, b), max(a, b));
break;
}
else
{
printf("LCA of %d and %d is %d.\n", a, b, tree[j]);
break;
}
}
}
}
else
{
if(ina) printf("ERROR: %d is not found.\n", b);
else if(inb) printf("ERROR: %d is not found.\n", a);
else printf("ERROR: %d and %d are not found.\n", a, b);
}
}
return 0;
}