1143 Lowest Common Ancestor
Posted lokwongho
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1143 Lowest Common Ancestor相关的知识,希望对你有一定的参考价值。
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.
.
知识点:搜索二叉树
思路:不用建BST树!将输入的数字按顺序存在list[]中;对于每个test,遍历一遍数组,将当前结点标记为a,如果u和v分别在a的左、右,或者u、v其中一个就是当前a,即(a >= u && a <= v) || (a >= v && a <= u),说明找到了这个共同最低祖先a,退出当前循环~最后根据要求输出结果即可。
因为输入的错误数字的范围不确定,所以要用map来判断输入是否合法
(看了 liuchuo.net 的思路)
1 #include <iostream> 2 #include <map> 3 using namespace std; 4 const int maxn = 100005; 5 6 int main(int argc, char *argv[]) { 7 int m,n; 8 int list[maxn]; 9 map<int,bool> mp; 10 11 scanf("%d %d",&m,&n); 12 for(int i=0;i<n;i++){ 13 scanf("%d",&list[i]); 14 mp[list[i]]=true; 15 } 16 int a,b,p; 17 for(int i=0;i<m;i++){ 18 scanf("%d %d",&a,&b); 19 int flag=0; 20 if(mp[a]==false&&mp[b]==false){ 21 flag=5; 22 }else{ 23 if(mp[a]==false){ 24 flag=3; 25 }else if(mp[b]==false){ 26 flag=4; 27 } 28 } 29 if(flag==0){ 30 for(int i=0;i<n;i++){ 31 p=list[i]; 32 if((a<=p&&p<=b) || (b<=p&&p<=a)){ 33 break; 34 } 35 } 36 } 37 if(flag==5){ 38 printf("ERROR: %d and %d are not found. ",a,b); 39 }else if(flag==4){ 40 printf("ERROR: %d is not found. ",b); 41 }else if(flag==3){ 42 printf("ERROR: %d is not found. ",a); 43 }else if(p==a){ 44 printf("%d is an ancestor of %d. ",a,b); 45 }else if(p==b){ 46 printf("%d is an ancestor of %d. ",b,a); 47 }else{ 48 printf("LCA of %d and %d is %d. ",a,b,p); 49 } 50 } 51 }
以上是关于1143 Lowest Common Ancestor的主要内容,如果未能解决你的问题,请参考以下文章
1143. Lowest Common Ancestor (30)
PAT 1143 Lowest Common Ancestor
1143 Lowest Common Ancestor (30分)