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<algorithm>
#include<cstdio>
#include<map>
using namespace std;
typedef struct NODE{
struct NODE* lchild, *rchild;
int data;
}node;
int M, N;
int pre[], in[];
map<int, int>mp;
node* create(int preL, int preR, int inL, int inR){
if(preL > preR)
return NULL;
node* root = new node;
root->data = pre[preL];
int mid;
for(int i = inL; i <= inR; i++){
if(in[i] == root->data){
mid = i;
break;
}
}
int len = mid - inL;
root->lchild = create(preL + , preL + len, inL, mid - );
root->rchild = create(preL + len + , preR, mid + , inR);
return root;
}
node* find(node* root, int u, int v){
if(root == NULL || root->data == u || root->data == v)
return root;
node* ll = find(root->lchild, u, v);
node* rr = find(root->rchild, u, v);
if(ll != NULL && rr != NULL){
return root;
}
if(ll != NULL){
return ll;
}
if(rr != NULL){
return rr;
}
}
int main(){
scanf("%d%d", &M, &N);
for(int i = ; i < N; i++){
scanf("%d", &in[i]);
pre[i] = in[i];
mp[pre[i]] = ;
}
sort(in, in + N);
node* root = create(, N - , , N - );
for(int i = ; i < M; i++){
int u, v;
scanf("%d%d", &u, &v);
if(mp.count(u) == && mp.count(v) == ){
printf("ERROR: %d and %d are not found.\n", u, v);
}else if(mp.count(u) == ){
printf("ERROR: %d is not found.\n",u );
}else if(mp.count(v) == ){
printf("ERROR: %d is not found.\n",v);
}else{
node* ans = find(root, u, v);
if(ans->data != u && ans->data != v){
printf("LCA of %d and %d is %d.\n", u, v, ans->data);
}else if(ans->data == u){
printf("%d is an ancestor of %d.\n", u, v);
}else{
printf("%d is an ancestor of %d.\n", v, u);
}
}
}
cin >> N;
return ;
}

总结:

1、题意:给出一个BST的先序序列,再给出两个点u、v,要求在BST中找出uv的最低公共祖先。

2、BST已知先序建树有两种方法,1)先序序列的顺序就是插入顺序,直接依次插入。2)对先序进行排序得到中序序列(BST的中序是从小到大的有序序列),由先序和中序进行递归建树。由于本题的N个数很大,使用insert方法会超时,尤其是在树高度为N时,复杂度为O(n^2)。所以最好采用先序+中序建树。

3、找最低的公共祖先。这种类型的任务一般采用后序递归遍历的办法:先处理左子树,再处理右子树,等左右子树都完成后,综合左右子树返回的信息与root的信息进行某些处理,再返回本层递归的结果。具体到本题,uv只有两种情况:1)即uv分别在某w节点的左右子树,则w为所求。2)uv本身就有祖先后代关系,则若u为祖先,u即为所求。

后序递归,若root为NULL或uv时,说明查找失败或成功,直接返回root。否则说明root为普通节点,先对root的左右子树分别查找。若左右子树都不空时,说明uv分别在root的左右两侧子树,则root即为所求。否则,说明uv在root的一侧子树,若在root的左侧,则将root左侧的查找结果返回。

A1143. Lowest Common Ancestor的更多相关文章

  1. PAT A1143 Lowest Common Ancestor (30 分)——二叉搜索树,lca

    The lowest common ancestor (LCA) of two nodes U and V in a tree is the deepest node that has both U ...

  2. PAT_A1143#Lowest Common Ancestor

    Source: PAT A1143 Lowest Common Ancestor (30 分) Description: The lowest common ancestor (LCA) of two ...

  3. [LeetCode] Lowest Common Ancestor of a Binary Tree 二叉树的最小共同父节点

    Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree. According ...

  4. [LeetCode] Lowest Common Ancestor of a Binary Search Tree 二叉搜索树的最小共同父节点

    Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BS ...

  5. 48. 二叉树两结点的最低共同父结点(3种变种情况)[Get lowest common ancestor of binary tree]

    [题目] 输入二叉树中的两个结点,输出这两个结点在数中最低的共同父结点. 二叉树的结点定义如下:  C++ Code  123456   struct BinaryTreeNode {     int ...

  6. [LeetCode]Lowest Common Ancestor of a Binary Search Tree

    Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BS ...

  7. 数据结构与算法(1)支线任务4——Lowest Common Ancestor of a Binary Tree

    题目如下:https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/ Given a binary tree, fin ...

  8. Lowest Common Ancestor of a Binary Search Tree

    Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BS ...

  9. Lowest Common Ancestor of a Binary Tree

    Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree. According ...

随机推荐

  1. Swagger2常用注解及其说明 (转)

    Api 用在Controller中,标记一个Controller作为swagger的文档资源 属性名称 说明 value Controller的注解 description 对api资源的描述 hid ...

  2. 新版本macos无法安装mysql-python包

    在更新了macos之后就发现无法正确安装python-mysql包了. 上网查阅了一下应该是c库或者osx的基础工具变动带来的问题.看到很多解决办法说使用pymysql,拜托我问的是如何安装pytho ...

  3. spring 标签

    */ @Slf4j @Service public class RetryService { @Autowired private MqConfig mqConfig; /** * 如果网络连接失败, ...

  4. lombok 使用 Idea

    Lombok 是一种 Java™ 实用工具,可用来帮助开发人员消除 Java 的冗长,尤其是对于简单的 Java 对象(POJO).它通过注解实现这一目的.import lombok.Getter;i ...

  5. 集合之TreeSet(含JDK1.8源码分析)

    一.前言 前面分析了Set接口下的hashSet和linkedHashSet,下面接着来看treeSet,treeSet的底层实现是基于treeMap的. 四个关注点在treeSet上的答案 二.tr ...

  6. @ControllerAdvice + @ExceptionHandler 全局处理 Controller 层异常==》记录

    对于与数据库相关的 Spring MVC 项目,我们通常会把 事务 配置在 Service层,当数据库操作失败时让 Service 层抛出运行时异常,Spring 事物管理器就会进行回滚. 如此一来, ...

  7. 【python练习题】程序1

    #题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? count = 0 for i in range(1,5): for j in range(1,5): for k ...

  8. HTTP协议那些事儿(Web开发补充知识点)

    HTTP协议 超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式.协作式和超媒体信息系统的应用层协议.HTTP是万维网的数据通信的基础. H ...

  9. Typora——安装Pandoc

    安装 打开typora,帮助-> Install and Use Pandoc  |  访问在线地址 https://support.typora.io/Install-and-Use-Pand ...

  10. Git——快速重命名文件和查看commit提交版本【四】

    快速重命名文件 $ git mv README.md readme.md 使用git mv命令后直接commit即可,不再需要进行add或rm操作 查看版本历史 所有的参数都可以进行组合使用的,比如我 ...