问题描述:
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 (<= 1000), the number of pairs of nodes to be tested; and N (<= 10000), 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 99Sample 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.
纪念一下3月18日PAT满分×4
AC代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
#include<bits/stdc++.h> using namespace std; struct node { int r; int l; int d; int root; int h; } no; vector<int> v1,v2; vector<node> v; inline void rt(int b1,int b2,int s,int root) { if(s) { auto itv=find(v1.begin()+b1,v1.begin()+b1+s,v2[b2]); int rs=s+b1+v1.begin()-itv-1; int ls=itv-v1.begin()-b1; if(root<0) { no.d=*itv; no.h=0; no.root=0; no.l=-1; no.r=-1; v.push_back(no); rt(b1,b2+1,ls,0); rt(b1+ls+1,b2+1+ls,rs,0); } else { int ro=v.size(); no.d=*itv; no.h=v[root].h+1; no.root=root; if(*itv<v[root].d) v[root].l=ro; else v[root].r=ro; no.l=-1; no.r=-1; v.push_back(no); rt(b1,b2+1,ls,ro); rt(b1+ls+1,b2+1+ls,rs,ro); } } } inline int bstfind(int d) { for(int i=0;i>-1;) { if(d<v[i].d) i=v[i].l; else if(d>v[i].d) i=v[i].r; else return i; } return -1; } int main() { // freopen("data4.txt","r",stdin); ios::sync_with_stdio(false); int n,m,c1,c2; cin>>n>>m; v2.resize(m); for(int i=0;i<m;i++) { cin>>v2[i]; } v1=v2; sort(v1.begin(),v1.end()); rt(0,0,v1.size(),-1); for(;n--;) { cin>>c1>>c2; int i1=bstfind(c1); int i2=bstfind(c2); if(i1<0&&i2<0) cout<<"ERROR: "<<c1<<" and "<<c2<<" are not found.\n"; else if(i1<0) cout<<"ERROR: "<<c1<<" is not found.\n"; else if(i2<0) cout<<"ERROR: "<<c2<<" is not found.\n"; else { int ii1=i1,ii2=i2; for(;ii1!=ii2;) { if(v[ii1].h>v[ii2].h) ii1=v[ii1].root; else if(v[ii1].h<v[ii2].h) ii2=v[ii2].root; else { ii1=v[ii1].root; ii2=v[ii2].root; } } if(ii1==i1) cout<<c1<<" is an ancestor of "<<c2<<"."<<endl; else if(ii1==i2) cout<<c2<<" is an ancestor of "<<c1<<"."<<endl; else cout<<"LCA of "<<c1<<" and "<<c2<<" is "<<v[ii1].d<<"."<<endl; } } return 0; } |