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);
}
} }

最新文章

  1. iOS 后台处理
  2. java 正则匹配括号对以及其他成对出现的模式
  3. java notepad++
  4. 数据结构-AVL树
  5. [转载]--用Python 自动安装软件
  6. Codeforces 366C Dima and Salad
  7. java中反射学习整理
  8. java 对象比较
  9. AspNet Core Api Restful +Swagger 实现微服务之旅 (三)
  10. Qt5中this application has requested the runtime to terminate it in an unusual way 无法运行问题的解决
  11. Codeforces 633F The Chocolate Spree 树形dp
  12. SQL Server 2016以上版本大小写敏感的解决办法
  13. stm32时钟树讲解
  14. AloneQIan---第一次作业
  15. SqlServer2005 各版本区别
  16. 远程查看java虚拟机内存使用情况jconsole
  17. 017:磁盘I/0介绍和测试
  18. 快色排序算法(C语言描述)
  19. 实现UAC对话框效果
  20. 30分钟精通React今年最劲爆的新特性——React Hooks

热门文章

  1. NOIP初赛篇——03中央处理器CPU
  2. ArrayDeque API 与算法分析
  3. Openstack dashboard 仪表盘服务 (八)
  4. 立完flag,你可能需要对flag进行量化
  5. 【Java】流程控制 - 顺序结构、 选择(分支)结构(单分支、双分支、多分支、嵌套)、循环结构(for、while、do...while)、跳转语句(break、continue)
  6. 【MySQL】1托2 ab复制 一个主机两个slave操作手册
  7. kubernets之configMap和secret
  8. ios获取缓存文件的大小并清除缓存
  9. oracle 12C单实例打PSU
  10. SAP FTP FOR ABAP programing