news 2026/8/6 21:16:46

PAT 1151 LCA in a Binary Tree

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PAT 1151 LCA in a Binary Tree



这一题的大意是给出一个BST的前序遍历,让我们在这棵BST二叉树中,给出两个的点,判断这两个点在这棵二叉树的最近公共祖先是谁,这两个点可能并不在树中,也有可能给出的节点是另一个节点的祖先,我们需要针对不同情况,做出不同的判断。
因为题目给出的节点的值是在int范围内,也就是说这个值可能会很大,我们可以选择离散化,把N个值映射到1-N,这样我们就可以用int depp[10005]直接来表示某一个节点的深度了。与unordered_map<int,int>来说速度更快了,因为是BST,所以中序遍历的节点就是将所有值从小到大排序的结果。实际上不用离散化也可以吧,
可以参考这一题:

PAT 1151 LCA in a Binary Tree

但BST中序遍历是升序的,用离散化也可以在建树的过程中少写一个for循环查找中序遍历中根节点的位置。
我们可以根据中序遍历和前序遍历来建树,用哈希表来存储节点,从而可以来找任意两个节点的公共祖先。
因为只需要找公共祖先,所以我们不用存储孩子节点,只需要找到每一个节点的父亲节点,和它的深度即可。
根据前序遍历和中序遍历的建树方法已经写过多次了,这里不再赘述,在建好树后,我们就需要关注如何找两个节点的最近公共祖先。
我们只需要保证当深度相同时,两个节点都去看它的父亲节点,如果一个节点的深度比另一个节点大,那么我们先去看这个深度深的节点,同时看深度深的节点的祖先节点是否会等于另一个节点。 直到两个节点深度一样。
大致思路就是如上
完整代码如下:

#include<bits/stdc++.h>#include<iostream>usingnamespacestd;intM;intN;unordered_map<int,int>parent;vector<int>preorder;vector<int>inorder;vector<int>temp;unordered_map<int,int>last;intdeep[10005];unordered_map<int,int>mp;intbuild(intprestart,intpreend,intinstart,intinend,intd){if(prestart>preend||instart>inend){return-1;}introot=preorder[prestart];deep[root]=d;intindex=root-1;intlen=index-instart;intxl=build(prestart+1,prestart+len,instart,instart+len-1,d+1);if(xl!=-1)parent[xl]=root;intxr=build(prestart+len+1,preend,instart+len+1,inend,d+1);if(xr!=-1)parent[xr]=root;returnroot;}intmain(){cin>>M>>N;for(inti=0;i<N;i++){intx;cin>>x;preorder.push_back(x);}temp=preorder;sort(temp.begin(),temp.end());for(inti=0;i<temp.size();i++){mp[temp[i]]=i+1;last[i+1]=temp[i];temp[i]=i+1;}inorder=temp;for(inti=0;i<preorder.size();i++){preorder[i]=mp[preorder[i]];}introot=build(0,N-1,0,N-1,0);intu;intv;for(inti=0;i<M;i++){cin>>u>>v;if(!mp.count(u)&&!mp.count(v)){//如果u和v都不存在printf("ERROR: %d and %d are not found.\n",u,v);continue;}elseif(!mp.count(u)){printf("ERROR: %d is not found.\n",u);continue;}elseif(!mp.count(v)){printf("ERROR: %d is not found.\n",v);continue;}//现在要找最近公共祖先了//先把u,v离散//如果它们不再同一层,那么就需要把它们放到同一层inttempu=mp[u];inttempv=mp[v];if(tempu==tempv){printf("%d is an ancestor of %d.\n",u,v);continue;}boolflag=0;while(tempu!=root||tempv!=root){if(deep[tempu]>deep[tempv]){if(parent[tempu]==tempv){//说明v是u的ancestorflag=1;printf("%d is an ancestor of %d.\n",v,u);break;}tempu=parent[tempu];}elseif(deep[tempu]==deep[tempv]){if(parent[tempu]==parent[tempv]){flag=1;printf("LCA of %d and %d is %d.\n",u,v,last[parent[tempu]]);break;}tempu=parent[tempu];tempv=parent[tempv];}else{if(parent[tempv]==tempu){//说明u是v的ancestorflag=1;printf("%d is an ancestor of %d.\n",u,v);break;}tempv=parent[tempv];}}if(flag==0){printf("LCA of %d and %d is %d.\n",u,v,last[parent[tempu]]);}}return0;}

注意,给出的两个节点可能是同一个,我们要进行特判。

inttempu=mp[u];inttempv=mp[v];if(tempu==tempv){printf("%d is an ancestor of %d.\n",u,v);continue;}

总结:这一题就是BST建树+最近公共祖先的求法,我们用根据实际情况灵活建树。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/5 23:57:21

ConvNeXt语义分割实战指南:5个快速上手的核心技巧

ConvNeXt语义分割实战指南&#xff1a;5个快速上手的核心技巧 【免费下载链接】ConvNeXt Code release for ConvNeXt model 项目地址: https://gitcode.com/gh_mirrors/co/ConvNeXt ConvNeXt作为2022年提出的新型卷积神经网络架构&#xff0c;在计算机视觉领域引起了广泛…

作者头像 李华
网站建设 2026/8/6 11:36:32

零基础学黑客:90% 的人会踩的 4 个坑!

我连编程都不会&#xff0c;能学黑客吗&#xff1f;”“学了半年工具&#xff0c;还是不会挖漏洞&#xff0c;问题出在哪&#xff1f;”“CTF 比赛拿了名次&#xff0c;为什么找工作还是碰壁&#xff1f;”—— 在网络安全学习社群里&#xff0c;这类疑问每天都在重复。很多人带…

作者头像 李华
网站建设 2026/8/6 15:46:22

基于冠豪猪CPO优化核极限学习机KELM的分类及性能评估报告:包含分类效果图、迭代优化图、混淆...

基于冠豪猪CPO优化核极限学习机KELM的分类 DBO-KELM分类 可替换为其它优化算法或者改进的优化算法。 包含有分类效果图&#xff0c;迭代优化图&#xff0c;混淆矩阵图以及准确率、精确率、召回率、调和平均数等各项评价指标。 注释详细替换数据就可以用。优化算法和极限学习机的…

作者头像 李华
网站建设 2026/8/5 20:47:33

Apache APISIX限流实战:从入门到精通的微服务流量控制完整指南

Apache APISIX限流实战&#xff1a;从入门到精通的微服务流量控制完整指南 【免费下载链接】apisix Apisix是一个基于Nginx的API网关&#xff0c;主要用于微服务架构中的API管理和服务发现。它的特点是高性能、轻量级、易于配置等。适用于API管理和负载均衡场景。 项目地址: …

作者头像 李华
网站建设 2026/8/5 16:37:44

Qwen3-Embedding-4B实战指南:企业级多语言检索系统构建方案

Qwen3-Embedding-4B实战指南&#xff1a;企业级多语言检索系统构建方案 【免费下载链接】Qwen3-Embedding-4B-GGUF 项目地址: https://ai.gitcode.com/hf_mirrors/Qwen/Qwen3-Embedding-4B-GGUF 在当今全球化业务环境中&#xff0c;企业面临着海量多语言文档处理、跨语…

作者头像 李华
网站建设 2026/8/3 7:18:07

Backtrader高频交易订单流处理实战指南

还在为量化交易中的订单执行效率而烦恼吗&#xff1f;想要快速掌握专业交易员都在使用的订单管理技巧吗&#xff1f;Backtrader作为功能强大的Python量化交易框架&#xff0c;其订单流处理机制能帮你轻松应对高频交易挑战。本文将带你从零开始&#xff0c;3分钟掌握核心订单操作…

作者头像 李华