zoukankan      html  css  js  c++  java
  • 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.
    ", a, b);
                else if(n -> val == b) printf("%d is an ancestor of %d.
    ", b, a);
                else printf("LCA of %d and %d is %d.
    ", a, b, n->val);
            } else if(!m[a] && !m[b]) printf("ERROR: %d and %d are not found.
    ", a, b);
            else if(!m[a]) printf("ERROR: %d is not found.
    ", a);
            else printf("ERROR: %d is not found.
    ", b);
        }
        return 0;
    }
  • 相关阅读:
    Java-笔记9-复习
    Java-笔记9
    Java-笔记8-复习
    Java0-笔记8
    Java-笔记7-复习
    hadoop-hdfs-ha配置-搭建
    Java-笔记7
    Java-笔记6-复习
    kettle-作业和参数
    kettle-脚本控件
  • 原文地址:https://www.cnblogs.com/littlepage/p/12818014.html
Copyright © 2011-2022 走看看