【牛客面试必刷TOP101】Day9.BM37 二叉搜索树的最近公共祖先和BM42 用两个栈实现队列

news2024/11/23 19:30:07

作者简介:大家好,我是未央;

博客首页:未央.303

系列专栏:牛客面试必刷TOP101

每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!!!!

文章目录

前言

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

题目描述

解题分析

二、用两个栈实现队列

题目描述

解题分析

总结


前言

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

题目描述

描述:

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。

1.对于该题的最近的公共祖先定义:对于有根树T的两个节点p、q,最近公共祖先LCA(T,p,q)表示一个节点x,满足x是p和q的祖先且x的深度尽可能大。在这里,一个节点也可以是它自己的祖先.

2.二叉搜索树是若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值; 若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值

3.所有节点的值都是唯一的。

4.p、q 为不同节点且均存在于给定的二叉搜索树中。


数据范围:

3<=节点总数<=10000

0<=节点值<=10000


举例说明:

如果给定以下搜索二叉树: {7,1,12,0,4,11,14,#,#,3,5},如下图:


示例1:


示例2:

解题分析

解题思路:
二叉搜索树的定义:

二叉搜索树是一种特殊的二叉树,它的每个节点值大于它的左子节点,且大于全部左子树的节点值,小于它右子节点,且小于全部右子树的节点值。因此二叉搜索树一定程度上算是一种排序结构。

图示举例说明:


思路:

二叉搜索树没有相同值的节点,因此分别从根节点往下利用二叉搜索树较大的数在右子树,较小的数在左子树,可以轻松找到p、q;

//节点值都不同,可以直接用值比较
while(node.val != target) { 
    path.add(node.val);
    //小的在左子树
    if(target < node.val) 
        node = node.left;
    //大的在右子树
    else 
        node = node.right;
}

直接得到从根节点到两个目标节点的路径,这样我们利用路径比较就可以找到最近公共祖先。


解题步骤:

  • step 1:根据二叉搜索树的性质,从根节点开始查找目标节点,当前节点比目标小则进入右子树,当前节点比目标大则进入左子树,直到找到目标节点。这个过程用数组记录遇到的元素。
  • step 2:分别在搜索二叉树中找到p和q两个点,并记录各自的路径为数组。
  • step 3:同时遍历两个数组,比较元素值,最后一个相等的元素就是最近的公共祖先。

图示过程解析:


代码编写:



二、用两个栈实现队列

题目描述

描述:

用两个栈来实现一个队列,使用n个元素来完成 n 次在队列尾部插入整数(push)和n次在队列头部删除整数(pop)的功能。 队列中的元素为int类型。保证操作合法,即保证pop操作时队列内已有元素。


数据范围:n≤1000;

要求:存储n个元素的空间复杂度为 O(n) ,插入与删除的时间复杂度都是 O(1)。


示例1:


示例2:


解题分析

解题思路:

双栈法(推荐使用)

思路:

元素进栈以后,只能优先弹出末尾元素,但是队列每次弹出的却是最先进去的元素,如果能够将栈中元素全部取出来,才能访问到最前面的元素,此时,可以用另一个栈来辅助取出。


解题步骤:

  • step 1:push操作就正常push到第一个栈末尾。
  • step 2:pop操作时,优先将第一个栈的元素弹出,并依次进入第二个栈中。
  • //将第一个栈中内容弹出放入第二个栈中
    while(!stack1.isEmpty()) 
        stack2.push(stack1.pop()); 
    
  • step 3:第一个栈中最后取出的元素也就是最后进入第二个栈的元素就是队列首部元素,要弹出,此时在第二个栈中可以直接弹出。
  • step 4:再将第二个中保存的内容,依次弹出,依次进入第一个栈中,这样第一个栈中虽然取出了最里面的元素,但是顺序并没有变。
  • //再将第二个栈的元素放回第一个栈
    while(!stack2.isEmpty()) 
        stack1.push(stack2.pop());
    

图示过程解析:


代码编写:

总结

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

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

相关文章

pycharm安装汉化包失败解决方法

在pycharm -setting-plugins-搜索“Chinese”进入此界面&#xff1a; 点击install&#xff0c;在安装时出现&#xff1a;Plugin "Chinese (Simplified) Language Pack / 中文语言包" was not installed: Invalid filename returned by a server 解决方法&#xff1a…

boot分页

List<ElectricDispatchTodoPO> todoList electricDispatchTodoService.queryTodlList(vo, sysStaffVO);// 计算总记录数int total todoList.size();// 如果总记录数大于0PageInfo<ElectricDispatchTodoPO> pageInfo new PageInfo<>();if (total > 0) {…

手把手教你分析IIS日志——IP访问次数,URI访问统计等

配置IIS网站的日志 下载日志分析工具 https://gitee.com/tangdd369098655/open-network-disk 解压打开 选择文件 指定分析规则&#xff08;还可以自己写规则哦~~&#xff09; 运行规则进行分析 今天就写到这里啦~ 小伙伴们&#xff0c;(&#xffe3;ω&#xffe3;(&#x…

Win10 环境下 VS2022 暴力编译PP-OCRv4

1 环境准备 下载PaddleOCR PaddleOCR C 部署代码位于 PaddleOCR\deploy\cpp_infer目录下 复制cpp_infer目录下include和src到项目目录下paddle_inference paddle_inference opencv 这里使用已经安装好的opencv4.5.5下载dirent-master.zip 下载dirent-master.zip, 解压并复制d…

MyLife - Docker安装Consul

Docker安装Consul 个人觉得像consul之类的基础设施在线上环境直接物理机安装使用可能会好些。但是在开发测试环境用docker容器还是比较方便的。这里学习下docker安装consul使用。 1. Consul 镜像库地址 Consul 镜像库地址&#xff1a;https://hub.docker.com/r/hashicorp/consu…

CleanMyMacX4.12.3最新免费版mac电脑管家

当我们收到一台崭新的mac电脑&#xff0c;第一步肯定是找到一款帮助我们管理电脑运行的“电脑管家”&#xff0c;监控内存运行、智能清理系统垃圾、清理Mac大文件旧文件、消除恶意软件、快速卸载更新软件、隐私保护、监控系统运行状况等。基本在上mac电脑防护一款CleanMyMac就够…

C/C++陷阱——变量名和函数名的冲突问题

C语言/C陷阱——变量名和函数名的冲突问题 先来看这两串代码&#xff1a; 代码一&#xff1a; #include <stdio.h> #include <stdlib.h>int rand 1;int main() {printf("%d\n", rand);return 0; }代码二&#xff1a; #include <stdio.h> #inc…

芯片设计:一颗芯片到底是如何诞生的(上)

目录 芯片设计整体流程 小故事&#xff1a;苹果的芯片设计路 需求分析 架构设计 逻辑设计 前端设计与验证 逻辑综合 DFT&#xff08;可测试性设计&#xff09; 物理实现 小结 芯片设计整体流程 一颗芯片&#xff0c;是如何诞生的呢&#xff1f;其实一颗芯片项目就是…

vue引入jQuery

配置 下载 npm install jquery --save在build的webpack.base.conf中 var webpackrequire("webpack")在module.exports中: plugins: [ //   new webpack.optimize.CommonsChunkPlugin(common.js),new webpack.ProvidePlugin({jQuery: "jquery",$: &quo…

三十五、【进阶】MySQL性能查看

1、基础语法 show global status like Com_______; 2、实际操作 &#xff08;1&#xff09;查看当前数据库sql语句的执行频率 show global status like Com_______; &#xff08;2&#xff09; 执行依次select语句 &#xff08;3&#xff09; 再次查看当前数据库sql语句的执…

GBJ2510-ASEMI电源控制柜专用GBJ2510

编辑&#xff1a;ll GBJ2510-ASEMI电源控制柜专用GBJ2510 型号&#xff1a;GBJ2510 品牌&#xff1a;ASEMI 封装&#xff1a;GBJ-4 恢复时间&#xff1a;&#xff1e;50ns 正向电流&#xff1a;25A 反向耐压&#xff1a;1000V 芯片个数&#xff1a;4 引脚数量&#xf…

python每日一练(7)

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

【LeetCode热题100】--739.每日温度

739.每日温度 方法&#xff1a;单调栈 可以维护一个存储下标的单调栈&#xff0c;从栈底到栈顶的下标对应的温度列表中的温度依次递减。如果一个下标在单调栈里&#xff0c;则表示尚未找到下一次温度更高的下标。 正向遍历温度列表。对于温度列表中的每个元素 temperatures[i…

YOLOv5算法改进(11)— 主干网络介绍(MobileNetV3、ShuffleNetV2和GhostNet)

前言:Hello大家好,我是小哥谈。主干网络通常指的是深度学习中的主干模型,通常由多个卷积层和池化层组成,用于提取输入数据的特征。在训练过程中,主干网络的参数会被不断优化以提高模型的准确性。YOLOv5算法中的主干网络可以有多种替换方案,为了后面讲解的方便,本篇文章就…

C结构体内定义结构体,不能直接赋值。

现像&#xff1a; 如下代码&#xff1a; 头文件&#xff1a; typedef struct aBlinkGpioPinOutAbst_{void (*initAsOutput)(void);void (*high)(void);void (*low)(void); }aBlinkGpioPinOutAbst;typedef struct aBlinkGpioAbst_{ #if GPIO_CONFIG_PA0 GPIO_CONFIG_AS_OUTPU…

Jetson Orin NX 开发指南(9): MAVROS 的安装、配置与运行

一、前言 由于 Jetson 系列开发板常作为自主无人机的机载电脑&#xff0c;而无人机硬件平台如 PX4 和 ArduPilot 等通过 MAVLink 进行发布无人机状态和位姿等信息&#xff0c;要实现机载电脑与 MAVLink 的通信&#xff0c;必须借助 Mavros 功能包&#xff0c;因此&#xff0c;…

分页机制详解

分页机制详解 《操作系统真象还原》第五章笔记 内存不足&#xff0c;需要分页机制 我们所写的代码仅仅是完成了某件事的一部分而已&#xff0c;也许是大部分&#xff0c;还有一部分是 CPU 硬件上负责的&#xff0c;这部分咱们不用管&#xff0c;由 CPU 自动完成。比如&#x…

内网渗透——隧道代理

文章目录 代理代理使用场景VPS建立隧道frpMSF木马生成监听开启frp服务端和客户端执行exe木马文件 代理 实验环境&#xff1a; 攻击机kali&#xff1a;192.168.188.133&#xff08;NAT模式&#xff09; 模拟的公网服务器&#xff08;本机&#xff09;&#xff1a;10.9.75.239 …

Python学习基础笔记六十八——循环

循环是编程语言常见的流程控制。 Python语句要让计算机反复地做一些事情&#xff0c;就要用到循环语句。 有While和for循环。 while循环&#xff1a; command input("请输入命令:") while command ! exit:print(f输入的命令是{command})command input("请输…