1151 LCA in a Binary Tree
题目链接
https://pintia.cn/problem-sets/994805342720868352/problems/1038430130011897856
解题思路
**题目意思是:**给定一个二叉树的中序与先序序列;在给出若干组节点a、b,求a,b的最近的公共祖先;
1.不建树的方法
1)标记中序序列中各个节点的下标;
2)在遍历时判断a、b的中序序列对应下标的情况:
ina>inroot&&inb>inroot //a,b都在右子树
ina>inroot&&inb<inroot || inb>inroot&&inbainroot //a、b分别在左右子树
ina<inroot&&inb<inroot //a、b都在左子树
总结
这题利用的是中序序列的性质:左子树 根 右子树;
代码展示
#include<bits/stdc++.h>
using namespace std;
/*
7 2 3 4 6 5 1 8
5 3 7 2 6 4 8 1
*/
int pre[10005],in[10005];
map<int,int>pos;
//根节点是1
void lca(int inl,int inr,int preroot,int a,int b){
if(inl>inr)return;
int inroot=pos[pre[preroot]],ina=pos[a],inb=pos[b];
if(ina<inroot&&inb>inroot||inb<inroot&&ina>inroot)
cout<<"LCA of "<<a<<" and "<<b<<" is "<<pre[preroot]<<"."<<endl;
else if(ina<inroot&&inb<inroot)
lca(inl,inroot-1,preroot+1,a,b);//???
else if(ina>inroot&&inb>inroot)
lca(inroot+1,inr,preroot+1+(inroot-inl),a,b);
else if(ina==inroot)
cout<<a<<" is an ancestor of "<<b<<"."<<endl;
else if(inb==inroot)
cout<<b<<" is an ancestor of "<<a<<"."<<endl;
}
int main(){
int m,n;
cin>>m>>n;
for(int i=1;i<=n;i++){
cin>>in[i];
pos[in[i]]=i;
}
for(int i=1;i<=n;i++)
cin>>pre[i];
while(m--){
int a,b;
cin>>a>>b;
int num=0;
if(pos[a]==0)num+=1;
if(pos[b]==0)num+=2;
if(num==1)
cout<<"ERROR: "<<a<<" is not found."<<endl;
else if(num==2)
cout<<"ERROR: "<<b<<" is not found."<<endl;
else if(num==3)
cout<<"ERROR: "<<a<<" and "<<b<<" are not found."<<endl;
else {
lca(1,n,1,a,b);
}
}
return 0;
}