二叉搜索树的最近公共祖先【数据结构】

二叉搜索树的最近公共祖先

题目描述
给定一棵二叉搜索树的先序遍历序列,要求你找出任意两结点的最近公共祖先结点(简称 LCA)。

输入
输入的第一行给出两个正整数:待查询的结点对数 M(≤ 1 000)和二叉搜索树中结点个数 N(≤ 10 000)。随后一行给出 N 个不同的整数,为二叉搜索树的先序遍历序列。最后 M 行,每行给出一对整数键值 U 和 V。所有键值都在整型int范围内。

输出
对每一对给定的 U 和 V,如果找到 A 是它们的最近公共祖先结点的键值,则在一行中输出 LCA of U and V is A.。但如果 U 和 V 中的一个结点是另一个结点的祖先,则在一行中输出 X is an ancestor of Y.,其中 X 是那个祖先结点的键值,Y 是另一个键值。如果 二叉搜索树中找不到以 U 或 V 为键值的结点,则输出 ERROR: U is not found. 或者 ERROR: V is not found.,或者 ERROR: U and V are not found.。

输入样例1
6 8
6 3 1 2 5 4 8 7
2 5
8 7
1 9
12 -3
0 8
99 99

输出样例1
LCA of 2 and 5 is 3.
8 is an ancestor of 7.
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<bits/stdc++.h>
using namespace std;
//树节点
struct tree
{int value;tree* left=NULL;tree* right=NULL;
};
//该节点是否存在
bool exist[10005];
int a[10005];
//插入节点建树
//要利用二叉搜索树的性质
tree* insert(int begin,int end)
{if(begin>end) return NULL;int rootValue=a[begin];tree* root=new tree;root->value=rootValue;//第一个比rootValue大的到结尾为右子树int i;for(i=begin+1;i<=end;i++){if(a[i]>rootValue) break;}//递归root->left=insert(begin+1,i-1);root->right=insert(i,end);return root;
}
//找公共祖先节点LCA
int findpar(int u,int v,tree* root)
{while(1){if(root->value>u&&root->value>v) root=root->left;else if(root->value<u&&root->value<v) root=root->right;else break;}return root->value;
}
int main()
{int m,n;cin>>m>>n;//根节点tree* root=NULL;for(int i=0;i<n;i++){cin>>a[i];exist[a[i]]=1;}root=insert(0,n-1);for(int i=0;i<m;i++){int u,v;cin>>u>>v;//两个节点都不存在if(!exist[u]&&!exist[v]){cout<<"ERROR: "<<u<<" and "<<v<<" are not found."<<endl;continue;}//一个节点不存在if(!exist[u]){cout<<"ERROR: "<<u<<" is not found."<<endl;continue;}if(!exist[v]){cout<<"ERROR: "<<v<<" is not found."<<endl;continue;}//两个节点都存在bool flag=0;if(findpar(u,v,root)==u) cout<<u<<" is an ancestor of "<<v<<"."<<endl;else if(findpar(u,v,root)==v) cout<<v<<" is an ancestor of "<<u<<"."<<endl;else cout<<"LCA of "<<u<<" and "<<v<<" is "<<findpar(u,v,root)<<"."<<endl;}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/214694.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于JavaWeb+SpringBoot+Vue在线拍卖系统的设计和实现

基于JavaWebSpringBootVue在线拍卖系统系统的设计和实现 源码获取入口Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 Lun文目录 摘 要 1 Abstract 1 1 系统概述 4 1.1 概述 4 1.2课题意义 4 1.3 主要内容 4 2 …

Git命令---绑定远程仓库

介绍 使用git命令绑定远程仓库 命令 git remote add origin https://gitee.com/x.xx.com/test.git

什么是多态

/*** Description 什么是多态*/ package com.oop;import com.oop.demo06.Person; import com.oop.demo06.Student;public class Application {public static void main(String[] args) {//一个对象的实际类型是确定的//new Student();//new Person();//可以指向的引用类型就不确…

C++新经典模板与泛型编程:策略技术中的算法策略

策略技术中的算法策略 在之前博客中funcsum()函数模板中&#xff0c;实现了对数组元素的求和运算。求和在这里可以看作一种算法&#xff0c;扩展一下思路&#xff0c;对数组元素求差、求乘积、求最大值和最小值等&#xff0c;都可以看作算法。而当前的funcsum()函数模板中&…

MySQL使用教程

数据构成了我们日益数字化的社会基础。想象一下&#xff0c;从移动应用和银行系统到搜索引擎&#xff0c;再到如 ChatGPT 这样的先进人工智能聊天机器人&#xff0c;这些工具若没有数据支撑&#xff0c;将寸步难行。你有没有好奇过这些海量数据都存放在哪里呢&#xff1f;答案正…

2023年团体程序设计天梯赛——总决赛题

F-L1-1 最好的文档 有一位软件工程师说过一句很有道理的话&#xff1a;“Good code is its own best documentation.”&#xff08;好代码本身就是最好的文档&#xff09;。本题就请你直接在屏幕上输出这句话。 输入格式&#xff1a; 本题没有输入。 输出格式&#xff1a; 在一…

读excel文件,借助openpyxl工具

读excel文件&#xff0c;借助openpyxl工具 import osimport requestsos.environ["http_proxy"] "http://127.0.0.1:7890" os.environ["https_proxy"] "http://127.0.0.1:7890"base_url "https://testnet.starscan.io/explore…

ALNS4VRPTWTF

文章概述 文章研究了城市物流背景下带有第三方转运设施的车辆路径问题。与经典的车辆路径问题不同&#xff0c;这些问题提供了将客户需求交付给第三方转运设施&#xff08;如城市集散中心&#xff09;的选择&#xff0c;并收取一定的费用。为了解决这些挑战&#xff0c;该研究…

LeetCode 279完全平方数 139单词拆分 卡码网 56携带矿石资源(多重背包) | 代码随想录25期训练营day45

动态规划算法6 LeetCode 279 完全平方数 2023.12.11 题目链接代码随想录讲解[链接] int numSquares(int n) {//1确定dp数组&#xff0c;其下标表示j的完全平方数的最少数量//3初始化&#xff0c;将dp[0]初始化为0&#xff0c;用于计算&#xff0c;其他值设为INT_MAX用于递推…

物料分类帐概览

原文地址&#xff1a;Overview: What is SAP Material Ledger? | SAP Blogs 物料分类账是收集物料主数据存储在物料主数据中的物料交易数据的工具。 物料分类帐使用此数据来计算价格以评估这些物料。 物料台账是实际成本核算的基础。它允许以多种货币对材料库存进行评估&am…

对象的生离死别

对象的生离死别 实验介绍 在构建一个类时&#xff0c;一般情况下需要编写构造函数、拷贝构造函数以及析构函数&#xff0c;这将直接影响程序的运行。而初始化列表是在调用构造函数时初始化参数的方式。 一个对象从实例化到销毁的历程&#xff1a; 知识点 内存分区构造函数exp…

java中什么是Spring Bean?

在Spring框架中&#xff0c;一个"Bean"是指由Spring IoC容器所管理的对象。这个对象可以是Java类的实例&#xff0c;也可以是引用其他对象的引用、集合或者是简单类型。Spring Bean是应用中由IoC容器负责创建、装配和管理的对象。 Spring中的Bean具有以下特征&#…

地牢手册-3d

Description 你进入了一个3D的宝藏地宫中探寻到了宝藏&#xff0c;你可以找到走出地宫的路带出宝藏&#xff0c;或者使用炉石空手回家。 地宫由立方体单位构成&#xff0c;立方体中不定会充满岩石。向上、下、前、后、左、右移动一个单位需要一分钟。你不能对角线移动并且地宫…

LabVIEW开发矿井排水监控系统

LabVIEW开发矿井排水监控系统 针对矿井水害对煤矿安全生产构成的威胁&#xff0c;设计了一种基于嵌入式PLC和LabVIEW的矿井排水监控系统。该系统结合了PLC的可靠控制与单片机的应用灵活性&#xff0c;有效克服了传统排水方法中的不足&#xff0c;如测量不准确、效率低下等问题…

react相关hooks(二)

不写性能优化的时候 const Child (props) > {console.log(child function is recalled)// count1改变时多次执行return (<div><h1>{ props.count2}</h1></div>) } function app () {const [count1.setCount1] useState(0)const [count2.setCount…

ESP8266模块(CH340)零基础实战

USB数据线连接ESP8266模块到电脑 先按住FLASH键,再按一下RST键,然后松开 此时电脑可识别出CH340 COM接口 CH340芯片厂商网址: wch.cn 传输比特率9600 win11自带驱动 下载Arduino IDE

一文了解什么是Selenium自动化测试?

一、Selenium是什么&#xff1f; 用官网的一句话来讲&#xff1a;Selenium automates browsers. Thats it&#xff01;简单来讲&#xff0c;Selenium是一个用于Web应用程序自动化测试工具。Selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作浏览器一样。支持的浏…

【美赛指南】新手小白必备参赛指南

美赛指南 一、2024美赛安排二、题目类型三、选题建议四、美赛前期准备五、常用算法 一、2024美赛安排 报名截至时间&#xff1a;2024年 2月2日 00&#xff1a;00 比赛时间&#xff1a;2024年 2月2日 6&#xff1a;00- 2月6日 9&#xff1a;00 提交截至日期&#xff1a;2024年2…

嵌入式系统复习--概述

文章目录 基本概念嵌入式系统的组成结构嵌入式操作系统嵌入式软件开发环境硬件基础简介下一篇 基本概念 嵌入式计算机&#xff1a;把嵌入到对象体系中、实现对象体系智能化控制的带有微控制器的计算机&#xff0c;称作嵌入式计算机 嵌入式系统&#xff1a;以应用为中心&#…

harmonyOS学习笔记之@Provide装饰器和@Consume装饰器

Provide和Consume&#xff0c;应用于与后代组件的双向数据同步&#xff0c;应用于状态数据在多个层级之间传递的场景。不同于State/Link装饰器修饰的 父子组件之间通过命名参数机制传递&#xff0c;Provide和Consume摆脱参数传递机制的束缚&#xff0c;实现跨层级传递。 其中Pr…