1151 LCA in a Binary Tree
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的更多相关文章
- 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 ...
- 【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 ...
- PAT 甲级 1151 LCA in a Binary Tree
https://pintia.cn/problem-sets/994805342720868352/problems/1038430130011897856 The lowest common anc ...
- 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 ...
- 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 ...
- 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 ...
- PAT甲级|1151 LCA in a Binary Tree 先序中序遍历建树 lca
给定先序中序遍历的序列,可以确定一颗唯一的树 先序遍历第一个遍历到的是根,中序遍历确定左右子树 查结点a和结点b的最近公共祖先,简单lca思路: 1.如果a和b分别在当前根的左右子树,当前的根就是最近 ...
- 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 ...
- PAT-1151(LCA in a Binary Tree)+最近公共祖先+二叉树的中序遍历和前序遍历
LCA in a Binary Tree PAT-1151 本题的困难在于如何在中序遍历和前序遍历已知的情况下找出两个结点的最近公共祖先. 可以利用据中序遍历和前序遍历构建树的思路,判断两个结点在根节 ...
随机推荐
- JMeter如何设置语言为中文
一.现象 JMeter安装后,默认语言为英文,如下图所示: 对于英文水平一般的人来说,刚开始使用起来比较费劲(比如我),影响我工作效率.那么,怎么将英文改为中文呢? 二.解决方法 1.修改设置 点击菜 ...
- 基于腾讯云存储COS的ClickHouse数据冷热分层方案
一.ClickHouse简介 ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS),支持PB级数据量的交互式分析,ClickHouse最初是为YandexMetrica ...
- UnityToLaya小插件-找出空格并替换
unity导出的文件中经常会出现带有空格的节点或者文件夹 而这些空格在本地开发测试过程中不会出现,当这些带有空格路径的文件需要放到网络上时,就出现问题了 所以这里写了一个简单的查找并清理空格的插件, ...
- 【MyBatis】MyBatis CRUD
MyBtis CRUD 文章源码 基于代理 DAO 的 CRUD 根据 ID 查询操作 在持久层接口中添加 findById 方法: public interface UserDAO { /** * ...
- 【Linux】linux中用vim来比较文件内容不同
1. 使用vim的比较模式打开两个文件: vim -d file1 file2 或 vimdiff file1 file2 2. 如果已经打开了文件file1,再打开另一个文件file2进行比较: : ...
- BAPI_GOODSMVT_CREATE的参数GOODSMVT_CODE的说明
BAPI_GOODSMVT_CREATE 的功能就是用于货物移动,其主要可以实现MB*事物的一些功能,其中该BAPI的参数 GOODSMVT_CODE就控制了对应哪个事物码的功能,下面给出该参数的值和 ...
- 1.5V升压3V集成电路升压芯片
干电池1.5V升压3V的升压芯片,适用于干电池升压产品输出3V供电 1.5V输入时,输出3V,电流可达500MA. PW5100是一款效率大.10uA低功耗 PW5100输入电压:0.7V-5V PW ...
- java 日期与时间操作
我们先来了解一下基本的概念 日期 2020-11-21 2020-11-22 时间 15:36:43 2020-11-21 15:36:43 时区 北京时间 2020-11-21 15:36:43 东 ...
- Py迭代和迭代器,生成器,生产者和消费者模型
迭代器iter 1.迭代的含义: 每次生成的结果依赖于上一次.问路,先问第一个人,第一个人不知道他就说第二个人知道,然后去找第二个人.第二个人不知道就说第三个人知道,然后去找第三个人 2.递归的含义: ...
- CISCO 如何重置3850交换机密码
SUMMARY STEPS: Connect a terminal or PC to the switch. Set the line speed on the emulation software ...