1143 Lowest Common Ancestor (30分)

The lowest common ancestor (LCA) of two nodes U and V in a tree is the deepest node that has both U and V as descendants.

A binary search tree (BST) is recursively defined as a binary tree which has the following properties:

  • The left subtree of a node contains only nodes with keys less than the node's key.
  • The right subtree of a node contains only nodes with keys greater than or equal to the node's key.
  • Both the left and right subtrees must also be binary search trees.

Given any two nodes in a BST, you are supposed to find their LCA.

Input Specification:

Each input file contains one test case. For each case, the first line gives two positive integers: M (≤ 1,000), the number of pairs of nodes to be tested; and N (≤ 10,000), the number of keys in the BST, respectively. In the second line, N distinct integers are given as the preorder traversal sequence of the BST. Then M lines follow, each contains a pair of integer keys U and V. All the keys are in the range of int.

Output Specification:

For each given pair of U and V, print in a line LCA of U and V is A. if the LCA is found and A is the key. But if A is one of U and V, print X is an ancestor of Y. where X is A and Y is the other node. If U or V is not found in the BST, print in a line ERROR: U is not found. or ERROR: V is not found. or ERROR: U and V are not found..

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.

二叉搜索树的公共祖先(和普通二叉树的公共祖先解法不一样),这题可以进行判断数字递归法,可以与另外一题做对比。

#include <iostream>
#include <map>
#include <algorithm>
using namespace std;
int M, N, a, b;
int pre[11000], in[11000];
map<int, bool> m;
struct node {
    int val;
    node *left, *right;
    node(int v): val(v), left(NULL), right(NULL) {}
}*root;
node* build(int root, int start, int end) {
    if(start > end) return NULL;
    int i = start;
    while(i < end && in[i] != pre[root]) i++;
    node *n = new node(in[i]);
    n->left = build(root + 1, start, i - 1);
    n->right = build(root + 1 + (i - start), i + 1, end);
    return n;
}
node* lca(node *root, int a, int b) {
    if(root->val < a && root->val < b) return lca(root->right, a, b);
    if(root->val > a && root->val > b) return lca(root->left, a, b);
    return root;
}
int main() {
    cin >> M >> N;
    for(int i = 0; i < N; i++) {
        cin >> pre[i];
        in[i] = pre[i];
        m[pre[i]] = 1;
    }
    sort(in, in + N);
    root = build(0, 0, N - 1);
    while(M--) {
        cin >> a >> b;
        if(m[a] && m[b]) {
            node *n = lca(root, a, b);
            if(n -> val == a) printf("%d is an ancestor of %d.\n", a, b);
            else if(n -> val == b) printf("%d is an ancestor of %d.\n", b, a);
            else printf("LCA of %d and %d is %d.\n", a, b, n->val);
        } else if(!m[a] && !m[b]) printf("ERROR: %d and %d are not found.\n", a, b);
        else if(!m[a]) printf("ERROR: %d is not found.\n", a);
        else printf("ERROR: %d is not found.\n", b);
    }
    return 0;
}

 

posted @ 2020-05-02 14:26  SteveYu  阅读(179)  评论(0编辑  收藏  举报