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.

Given any two nodes in a binary tree, 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 binary tree, respectively. In each of the following two lines, N distinct integers are given as the inorder and preorder traversal sequences of the binary tree, respectively. It is guaranteed that the binary tree can be uniquely determined by the input sequences. 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 binary tree, 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
7 2 3 4 6 5 1 8
5 3 7 2 6 4 8 1
2 6
8 1
7 9
12 -3
0 8
99 99
 

Sample Output:

LCA of 2 and 6 is 3.
8 is an ancestor of 1.
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<vector>
#include<algorithm>
#include<unordered_set>
#include<map>
using namespace std; struct Node
{
int data;
Node *parent;
Node* leftchild;
Node* rightchild;
};
vector<int> inorder;
vector<int> preorder;
map<int,Node*> mymap;
bool flag;
Node* create(int prel,int prer,int inl,int inr,Node *pa)
{
if(prel>prer) return NULL;
Node* node=new Node;
node->data=preorder[prel];
node->parent=pa;
mymap[node->data]=node;
node->leftchild=NULL;
node->rightchild=NULL;
int i;
for(i=inl;i<inr;i++)
{
if(preorder[prel]==inorder[i]) break;
}
int numl=i-inl;
node->leftchild=create(prel+1,prel+numl,inl,i-1,node);
node->rightchild=create(prel+numl+1,prer,i+1,inr,node);
return node;
}
void check(Node* root,int data1,int data2)
{
vector<int> seq1;
vector<int> seq2;
Node* temp1=mymap[data1];
Node* temp2=mymap[data2];
while(temp1!=NULL)
{
seq1.push_back(temp1->data);
temp1=temp1->parent;
}
while(temp2!=NULL)
{
seq2.push_back(temp2->data);
temp2=temp2->parent;
}
int mark=-1;
int k=seq1.size()-1;
for(int t=seq2.size()-1;t>=0;t--)
{
if(seq2[t]==seq1[k])
{
mark=seq1[k];
k--;
}
}
if(mark!=data1&&mark!=data2) printf("LCA of %d and %d is %d.\n",data1,data2,mark);
else if(mark==data1) printf("%d is an ancestor of %d.\n",data1,data2);
else if(mark==data2) printf("%d is an ancestor of %d.\n",data2,data1); } int main()
{
unordered_set<int> ss;
int testnum;
int vnum;
scanf("%d %d",&testnum,&vnum);
for(int i=0;i<vnum;i++)
{
int temp;
scanf("%d",&temp);
inorder.push_back(temp);
ss.insert(temp);
}
for(int i=0;i<vnum;i++)
{
int temp;
scanf("%d",&temp);
preorder.push_back(temp);
}
Node* root=create(0,vnum-1,0,vnum-1,NULL);
for(int i=0;i<testnum;i++)
{
int test1;
int test2;
scanf("%d %d",&test1,&test2);
if(ss.find(test1)==ss.end()&&ss.find(test2)==ss.end())
{
printf("ERROR: %d and %d are not found.\n",test1,test2);
}
else if(ss.find(test1)==ss.end())
{
printf("ERROR: %d is not found.\n",test1);
}
else if(ss.find(test2)==ss.end())
{
printf("ERROR: %d is not found.\n",test2);
}
else
{
check(root,test1,test2);
}
} }

1151 LCA in a Binary Tree的更多相关文章

  1. PAT 1151 LCA in a Binary Tree[难][二叉树]

    1151 LCA in a Binary Tree (30 分) The lowest common ancestor (LCA) of two nodes U and V in a tree is ...

  2. 【PAT 甲级】1151 LCA in a Binary Tree (30 分)

    题目描述 The lowest common ancestor (LCA) of two nodes U and V in a tree is the deepest node that has bo ...

  3. PAT 甲级 1151 LCA in a Binary Tree

    https://pintia.cn/problem-sets/994805342720868352/problems/1038430130011897856 The lowest common anc ...

  4. 1151 LCA in a Binary Tree(30 分)

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

  5. PAT Advanced 1151 LCA in a Binary Tree (30) [树的遍历,LCA算法]

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

  6. 1151 LCA in a Binary Tree (30point(s))

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

  7. PAT甲级|1151 LCA in a Binary Tree 先序中序遍历建树 lca

    给定先序中序遍历的序列,可以确定一颗唯一的树 先序遍历第一个遍历到的是根,中序遍历确定左右子树 查结点a和结点b的最近公共祖先,简单lca思路: 1.如果a和b分别在当前根的左右子树,当前的根就是最近 ...

  8. PAT_A1151#LCA in a Binary Tree

    Source: PAT A1151 LCA in a Binary Tree (30 分) Description: The lowest common ancestor (LCA) of two n ...

  9. PAT-1151(LCA in a Binary Tree)+最近公共祖先+二叉树的中序遍历和前序遍历

    LCA in a Binary Tree PAT-1151 本题的困难在于如何在中序遍历和前序遍历已知的情况下找出两个结点的最近公共祖先. 可以利用据中序遍历和前序遍历构建树的思路,判断两个结点在根节 ...

随机推荐

  1. Mac安装mysqlclient

    前言 祝大家身体健康 正文 如何在Mac上安装Python的mysqlclient模块 安装mysql brew install mysql 安装mysql-client brew install m ...

  2. SonarQube学习(五)- SonarQube之自定义规则使用

    一.前言 古人云:"欲速则不达",最近真的是深有体会.学习也是如此,不是一件着急的事,越是着急越不会. 就拿SonarQube来说吧,去年年末就想学来着,但是想着想着就搁置了,有时 ...

  3. LeetCode144 二叉树的前序遍历

    给定一个二叉树,返回它的 前序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? /** * Defin ...

  4. Mac安装homebrew,postman,charles

    Homebrew是一款Mac OS平台下的软件包管理工具,拥有安装.卸载.更新.查看.搜索等很多实用的功能.简单的一条指令,就可以实现包管理,而不用你关心各种依赖和文件路径的情况,十分方便快捷. 1. ...

  5. scp传文件夹

    scp -r /root/backupdb/2014-08-15(文件夹)    root@192.168.1.98:/root(目录)

  6. 【TNS】TNS-00515 TNS-12560 TNS-12545解决方案

    今天同事的plsql连接不上数据库,我用他的本地tnsping是不通的,于是上服务器上查看下,结果发现监听没起来,不知道怎么就断了 再次尝试重启 lsnrctl start 发现直接报错: NSLSN ...

  7. 详解MySQL执行事务的语法和流程

    摘要:MySQL 提供了多种存储引擎来支持事务. MySQL 提供了多种存储引擎来支持事务.支持事务的存储引擎有 InnoDB 和 BDB,其中,InnoDB 存储引擎事务主要通过 UNDO 日志和 ...

  8. webapi Swagger 配置 services.BuildServiceProvider() 报警 ASP0000 问题处理

    问题起源 网上的常见配置 Swagger 配置 在Startup类的 ConfigureServices 使用 services.BuildServiceProvider() ,其中有段代码如下: v ...

  9. ovs-fields

    1. 字段匹配 精确匹配 field=value,如,nw_src=10.1.2.3. 按位匹配 field=value/mask,如,nw_src=10.1.0.0/255.255.0.0,nw_s ...

  10. IEEE Standard 754 for Binary Floating-Point Arithmetic

    IEEE 754-2008 - IEEE Standard for Floating-Point Arithmetic https://standards.ieee.org/standard/754- ...