1143 Lowest Common Ancestor (30分)

给定一个BST的先序遍历序列和m个数值对,求每个数值对的深度最大的公共父节点。
可以不建树,顺序查找先序遍历的那个数组。查找值是否存在树中,若两个都存在则开始查找,不存在则输出不存在。先序遍历中根节点总是最先访问,因此顺序查找序列中最先满足val1<currval<val2或val1>currval>val2的currval就是LCA。当currval和val1或val2其中一个相等时,输出和currval相等的那个节点为另一节点的父节点。

#include <stdio.h>
#include <vector>
#include <algorithm>

using namespace std;
int m,n;
int arr[10010];
void findAnc(int val1,int val2){
    for(int i=0;i<n;i++){
        int currval=arr[i];
        if((currval>val1 && currval>val2)||(currval>val1 && currval>val2))continue;
        else if(val1==currval){
            printf("%d is an ancestor of %d.\n",val1,val2);
            return;
        }else if(val2==currval){
            printf("%d is an ancestor of %d.\n",val2,val1);
            return;
        }else if((val1>currval && val2<currval) || (val1<currval && val2>currval)){
            printf("LCA of %d and %d is %d.\n",val1,val2,currval);
            return;
        }

    }
}
int main(){
    scanf("%d%d",&m,&n);
    for(int i=0;i<n;i++){
        scanf("%d",&arr[i]);
    }
    for(int i=0;i<m;i++){
        int key1,key2;
        scanf("%d %d",&key1,&key2);
        bool have1=!(find(arr,arr+n,key1)==arr+n);
        bool have2=!(find(arr,arr+n,key2)==arr+n);
        if(!have1 && !have2)printf("ERROR: %d and %d are not found.\n",key1,key2);
        else if(!have2)printf("ERROR: %d is not found.\n",key2);
        else if(!have1)printf("ERROR: %d is not found.\n",key1);
        else{
            findAnc(key1,key2);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值