1143 Lowest Common Ancestor (30分)
Posted littlepage
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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; }
以上是关于1143 Lowest Common Ancestor (30分)的主要内容,如果未能解决你的问题,请参考以下文章
1143. Lowest Common Ancestor (30)
PAT 1143 Lowest Common Ancestor
1143 Lowest Common Ancestor (30分)