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 Xis 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 <stdio.h>
#include <algorithm>
#include <iostream>
#include <map>
#include <vector>
#include <set>
using namespace std;
const int maxn=;
int n,m,k;
int inorder[maxn],preorder[maxn];
struct node{
int data;
node* left;
node* right;
};
node* create(int prel,int prer,int inl,int inr){
if(prel>prer){
return NULL;
}
node* root=new node;
root->data=preorder[prel];
int k;
for(k=inl;k<=inr;k++){
if(inorder[k]==preorder[prel]){
break;
}
}
int numleft=k-inl;
root->left = create(prel+,prel+numleft,inl,k-);
root->right = create(prel+numleft+,prer,k+,inr);
return root;
}
bool findnode(int x){
for(int i=;i<m;i++){
if(preorder[i]==x) return true;
}
return false;
}
node* lca(node* root,int x1,int x2){
if(root==NULL)return NULL;
if(root->data==x1 || root->data==x2) return root;
node* left = lca(root->left,x1,x2);
node* right = lca(root->right,x1,x2);
if(left && right) return root;
else if(left==NULL) return right;
else return left;
}
int main(){
scanf("%d %d",&n,&m);
for(int i=;i<m;i++){
int c1;
scanf("%d",&c1);
preorder[i]=c1;
inorder[i]=c1;
}
sort(inorder,inorder+m);
node *root=create(,m-,,m-);
for(int i=;i<n;i++){
int x1,x2;
scanf("%d %d",&x1,&x2);
if(!findnode(x1) && !findnode(x2)){
printf("ERROR: %d and %d are not found.\n",x1,x2);
}
else if(!findnode(x1)) printf("ERROR: %d is not found.\n",x1);
else if(!findnode(x2)) printf("ERROR: %d is not found.\n",x2);
else{
node* res = lca(root,x1,x2);
if(res->data == x1) printf("%d is an ancestor of %d.\n",x1,x2);
else if(res->data == x2) printf("%d is an ancestor of %d.\n",x2,x1);
else printf("LCA of %d and %d is %d.\n",x1,x2,res->data);
}
}
}

注意点:这题和上一道1151基本一样,感觉是中间隔一次考试就会出现类似题目,不同的就是这个是给出二叉搜索树和他的先序遍历,而二叉搜索树的中序遍历其实就是对先序遍历排序,然后题目就一样了

最新文章

  1. Oracle 11g系列:SQL Plus与PL/SQL
  2. CodeForces 710A King Moves(水题-越界问题)
  3. android下使用smack需引入的包
  4. UI1_ScrollViewHomeWork
  5. Mac OS X 10.10优胜美地怎样完美接管iphone上的电话和短信
  6. [Locked] Wiggle Sort
  7. 08-使用for循环输出杨辉三角(循环)
  8. (转载)提高系统OOP抽象以应对复杂的需求
  9. JAVA NIO学习二:通道(Channel)与缓冲区(Buffer)
  10. DateHelper
  11. WCF数据传输安全--数字证书
  12. cocos2dx 3.13 在Mac平台下配置安卓环境变量
  13. Python+Selenium+Unittest+Ddt+HTMLReport分布式数据驱动自动化测试框架结构
  14. 基于序列化技术(Protobuf)的socket文件传输
  15. hdu-1128(数学问题,筛数)
  16. Scala-构造函数
  17. CSDN-Code平台公钥设置
  18. 在Linux环境下mysql的root密码忘记解决方法
  19. django系列7.2--django中的cookie和session基本操作,浏览器登陆验证的不同实现
  20. AC日记——严酷的训练 洛谷 P2430

热门文章

  1. expressjs项目里使用npm run dev,实现热更新
  2. csharp: DefaultValueAttribute Class
  3. 洛谷P3600 随机数生成器(期望dp 组合数)
  4. 本地存储之sessionStorage
  5. 小结:ES7——async和await初识
  6. 【读书笔记】iOS-访问iPod媒体库
  7. 关于input的焦点事件
  8. AJAX的优点 个人理解记录
  9. 12-openldap使用AD密码
  10. Java中当前对象引用