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. at定时任务

    1)at是只执行一次,执行完后任务删除.at的守护进程atd会以后台模式运行,检查作业队列来运行.2)默认 atd每60秒巡逻一次,有作业时候,检查作业时间,如果和当前时间一样,就执行任务3)在使用a ...

  2. LeetCode 371两数之和

    题目描述: 不使用运算符 + 和 - ​​​​​​​,计算两整数 ​​​​​​​a .b ​​​​​​​之和. 思路: 既然不能使用运算符操作就要考虑到,位运算的加法. 加法有进位的时候和不进位的时候 ...

  3. 基于腾讯云存储网关 CSG 实现视频在线转码分发

    一.背景 随着越来越多的传统业务云化和云端业务发展,数据上云和云端数据处理领域的需求爆发式增长.腾讯云存储网关CSG提供一键部署开箱即用的便捷模式,深度结合COS对象存储生态,为用户提供方便快捷的数据 ...

  4. java锁的对象引用

    当访问共享的可变数据时,通常需要同步.一种避免使用同步的方式就是不共享数据. 如果数据仅在单线程内访问,就不需要同步,这种技术称为"线程封闭",它是实现线程安全性最简单方式之一. ...

  5. os.walk() 遍历目录下的文件夹和文件

    os.walk(top, topdown=True, onerror=None, followlinks=False) top:顶级目录 os.walk()返回一个三元tupple(dirpath, ...

  6. 原生js制作表单验证,基本的表单验证方法

    表单验证是web前端最常见的功能之一,也属于前端开发的基本功.自己完成一个表单验证的开发,也有助于加深对字符串处理和正则表达式的理解. 基本的表单验证包括如:字母验证.数字验证.字母和数字验证.汉字验 ...

  7. SAP表的锁定与解锁

    表的锁定模式有三种模式. lock mode有三种模式:分别是S,E,X.含义如下:     S (Shared lock, read lock)     E (Exclusive lock, wri ...

  8. Android 中使用 config.gradle

    各位同学大家好,当然了如果不是同学,那么大家也同好.哈哈. 大家知道config.gradle 是什么吗?我也不知道.开个完笑,其实config.gradle 就是我们为了统一gradle 中的各种配 ...

  9. Scrapy——將爬取圖片下載到本地

    1. Spider程序: 1 import scrapy, json 2 from UnsplashImageSpider.items import ImageItem 3 4 class Unspl ...

  10. JMeter性能测试9:阿里云服务器压测

    第一步准备好jmeter脚本 第二步 将本地的jmeter脚本上传到阿里云进行验证 检验阿里云的jmeter是否能正常运行 将本地的脚本上传到阿里云使用xshell进入到该目录下 使用命令运行刚才上传 ...