PAT甲级1151 利用共同父节点的通用性质进行判断

PAT甲级1151 利用共同父节点的通用性质进行判断

如果c是a和b的共同父节点,那么一定满足,1.c的中序遍历下标在a与b的中间,即
在这里插入图片描述
2.c是从上到下发现的第一个符合该点的数

所以思路为:利用前序遍历和1中序遍历得到层序遍历,然后遍历层序数组,第一个满足上述表达式的极为所求。

#include <iostream>
#include <map>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int pre[10010],in[10010];
int m,n;
vector<int> lay;
map<int,int> mp,findIn;
void buildTree(int prel,int prer,int inl,int inr){
    if(prel>prer)
        return;
    int first=pre[prel];
    int i=inl;
    for(;i<inr;i++){
        if(in[i]==first)
            break;
    }
    int num=i-inl;
    lay.push_back(first);
    buildTree(prel+1,prel+num,inl,i-1);
    buildTree(prel+num+1,prer,i,inr);
}
int main(){
    cin>>m>>n;
    for(int i=0;i<n;i++){
        cin>>in[i];
        mp[in[i]]=1;
        findIn[in[i]]=i;
    }
    for(int i=0;i<n;i++)
        cin>>pre[i];
    buildTree(0,n-1,0,n-1);
    for(int i=0;i<m;i++){
        int a,b;
        cin>>a>>b;
        if(mp[a]==0&&mp[b]==0)
            cout<<"ERROR: "<<a<<" and "<<b<<" are not found."<<endl;
        else if(mp[a]==0)
            cout<<"ERROR: "<<a<<" is not found."<<endl;
        else if(mp[b]==0)
            cout<<"ERROR: "<<b<<" is not found."<<endl;
        else{
            for(int i=0;i<n;i++){
                int indexa=findIn[a],indexb=findIn[b],index=findIn[lay[i]];
                if((index>=indexa&&index<=indexb)||(index>=indexb&&index<=indexa)){
                    if(index==indexa)
                        cout<<a<<" is an ancestor of "<<b<<"."<<endl;
                    else if(index==indexb)
                        cout<<b<<" is an ancestor of "<<a<<"."<<endl;
                    else
                        cout<<"LCA of "<<a<<" and "<<b<<" is "<<lay[i]<<"."<<endl;
                    break;
                }
            }
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值