PAT甲级1143.

目录

A1143

题目

样例

输入:

6 8
6 3 1 2 5 4 8 7
2 5
8 7
1 9
12 -3
0 8
99 99

输出:

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.

思路和坑点

  思路:
  题目给出的是二叉搜索树的先序遍历,可以根据二叉搜索树的特性来查找,具体原理参见代码注释,要留意题目给出的数据结构的特性,并加以利用。

AC代码

#include<bits/stdc++.h>
using namespace std; 
unordered_map<int, bool> mp;                            //标记是否出现过
int main() {
    int m, n, u, v, a;
    scanf("%d %d", &m, &n);
    vector<int> pre(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];                                 //判断每一个结点和uv的关系
            if ((a >= u && a <= v) || (a >= v && a <= u)) break;//根据先序的顺序规律,当U和V出现在a的左右两侧或者某个在a的位置上时,a是公共祖先
        }
        if (mp[u] == false && mp[v] == false)           //根据是否存在的情况分类输出结果
            printf("ERROR: %d and %d are not found.\n", u, v);
        else if (mp[u] == false || mp[v] == false)
            printf("ERROR: %d is not found.\n", mp[u] == false ? u : v);
        else if (a == u || a == v)
            printf("%d is an ancestor of %d.\n", a, a == u ? v : u);
        else
            printf("LCA of %d and %d is %d.\n", u, v, a);
    }
    return 0;
}