100道面试必会算法-32-二叉树右视图用栈实现队列

news2024/12/30 3:40:22

100道面试必会算法-32-二叉树右视图&用栈实现队列

给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

示例 1:

img

输入: [1,2,3,null,5,null,4]
输出: [1,3,4]

示例 2:

输入: [1,null,3]
输出: [1,3]

示例 3:

输入: []
输出: []

解决思路

解决这个问题,可以采用层序遍历二叉树的方式,并在每一层中只记录最右侧的节点值。

解决方法

  1. 初始化:首先初始化一个空列表 res 用于存储结果,并确保给定的根节点不为空。
  2. 层序遍历:利用队列来实现层序遍历,首先将根节点入队。
  3. 遍历节点:在每一层中,记录当前层的节点数,然后依次弹出队列中的节点。
  4. 记录右视图:每次弹出节点时,检查该节点是否是当前层的最后一个节点,如果是,则将其值添加到结果列表中。
  5. 入队子节点:同时,将弹出节点的左右子节点入队。
  6. 返回结果:最后返回结果列表 res

代码实现

class Solution {
    // 定义函数,用于获取二叉树的右视图
    public List<Integer> rightSideView(TreeNode root) {
        // 初始化结果列表
        List<Integer> res = new ArrayList<>();
        // 如果根节点为空,直接返回空结果列表
        if (root == null)
            return res;
        // 初始化队列,用于层序遍历二叉树
        LinkedList<TreeNode> queue = new LinkedList();
        // 将根节点入队
        queue.push(root);
        // 开始循环遍历二叉树
        while (!queue.isEmpty()) {
            // 记录当前层的节点数
            int count = queue.size();
            while (count > 0) {
                // 弹出队首元素
                TreeNode node = queue.poll();
                // 如果是当前层最后一个节点,将其值加入结果列表
                if (count == 1) {
                    res.add(node.val);
                }

                // 将左子节点入队
                if (node.left != null) {
                    queue.offer(node.left);
                }
                // 将右子节点入队
                if (node.right != null) {
                    queue.offer(node.right);
                }
                count--;
            }
        }
        return res;
    }
}

时间复杂度为 O(n)

用栈实现队列

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(pushpoppeekempty):

实现 MyQueue 类:

  • void push(int x) 将元素 x 推到队列的末尾
  • int pop() 从队列的开头移除并返回元素
  • int peek() 返回队列开头的元素
  • boolean empty() 如果队列为空,返回 true ;否则,返回 false

说明:

  • 只能 使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
  • 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。

示例 1:

输入:
["MyQueue", "push", "push", "peek", "pop", "empty"]
[[], [1], [2], [], [], []]
输出:
[null, null, null, 1, 1, false]

解释:
MyQueue myQueue = new MyQueue();
myQueue.push(1); // queue is: [1]
myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue)
myQueue.peek(); // return 1
myQueue.pop(); // return 1, queue is [2]
myQueue.empty(); // return false

问题概述

需要设计一个队列的实现,但是使用栈作为底层数据结构。具体来说,需要实现 pushpoppeekempty 四种操作。

解决思路

为了使用栈来实现队列,可以使用两个栈,一个用于存储队列元素,另一个用于辅助操作。主要思路是保持一个栈始终为空,当需要执行 poppeek 操作时,将所有元素从一个栈中弹出并压入另一个栈,以保证队列顺序。

解决方法

  1. 初始化:使用两个栈 AB 分别用来存储队列元素和辅助操作。
  2. 入队操作 (push):将元素压入栈 A,相当于队尾入队。
  3. 出队操作 (pop):首先调用 peek 方法获取队首元素,然后从栈 B 中弹出栈顶元素,相当于队首出队,并返回队首元素。
  4. 查看队首元素 (peek):如果栈 B 不为空,直接返回栈 B 的栈顶元素;否则,如果栈 A 也为空,说明队列为空,返回 -1;否则,将栈 A 中的所有元素依次弹出并压入栈 B,以实现队列元素的倒序,然后返回栈 B 的栈顶元素。
  5. 判断队列是否为空 (empty):当栈 A 和栈 B 都为空时,说明队列为空。
class MyQueue {
    private Stack<Integer> A; // 栈A用来存储队列元素
    private Stack<Integer> B; // 栈B用来辅助操作

    public MyQueue() {
        A=new Stack<>(); // 初始化栈A
        B=new Stack<>(); // 初始化栈B
    }

    public void push(int x) {
        A.push(x); // 将元素压入栈A,相当于队尾入队
    }

    public int pop() {
        int re=peek(); // 获取栈B的栈顶元素,即队首元素
        B.pop(); // 弹出栈B的栈顶元素,相当于队首出队
        return re; // 返回队首元素
    }

    public int peek() {
        if(!B.isEmpty()) return B.peek(); // 如果栈B不为空,则直接返回栈B的栈顶元素
        if(A.isEmpty()) return -1; // 如果栈A也为空,说明队列为空,返回-1
        while(!A.isEmpty()){
            B.push(A.pop()); // 将栈A中的元素依次弹出并压入栈B,实现队列元素倒序
        }
        return B.peek(); // 返回栈B的栈顶元素,即队首元素
    }

    public boolean empty() {
        return A.isEmpty() && B.isEmpty(); // 如果栈A和栈B都为空,说明队列为空
    }
}


      }
        return B.peek(); // 返回栈B的栈顶元素,即队首元素
    }

    public boolean empty() {
        return A.isEmpty() && B.isEmpty(); // 如果栈A和栈B都为空,说明队列为空
    }
}

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

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

相关文章

powershell:使用IProgressDialog接口创建windows标准进度对话框。

禁止任何形式的抄录&#xff0c;转载请附上本文章地址 Add-Type using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Runtime.InteropServices; // 定义ProgressDialog类&#xff0c;实现IProgressDialog接口 …

数据库之PostgreSQL详解

一、PostgreSQL介绍 PostgreSQL是一个功能强大的 开源 的关系型数据库。底层基于C实现。 PostgreSQL的开源协议和Linux内核版本的开源协议是一样的。。BDS协议&#xff0c;这个协议基本和MIT开源协议一样&#xff0c;说人话&#xff0c;就是你可以对PostgreSQL进行一些封装&a…

K210视觉识别模块学习笔记5:(嘉楠)训练使用模型_识别人脸

今日开始学习K210视觉识别模块:(嘉楠)训练与使用模型_识别人脸 亚博智能的K210视觉识别模块...... 固件库版本: canmv_yahboom_v2.1.1.bin 之前的训练网址部署模型时需要我们自己更换固件&#xff0c;而且还不能用亚博的图像操作库函数了&#xff0c;这十分不友好&#xff0…

vue3关于配置代码检查工作流,husky出现创建错误问题的解决方法

关于配置代码检查工作流&#xff0c;husky出现error: cant create hook, .husky directory doesnt exist (try running husky install) 首先根据截图发现最明显的信息是error&#xff0c;中文译为-----错误&#xff1a;无法创建钩子&#xff0c;.husky 目录不存在&#xff08;尝…

【数据结构】十二、八种常用的排序算法讲解及代码分享

目录 一、插入排序 1)算法思想 2&#xff09;代码 二、希尔排序 1&#xff09;算法思想 2&#xff09;代码 三、选择排序 1&#xff09;算法思想 2&#xff09;代码 四、堆排序 1&#xff09;什么是最大堆 2&#xff09;如何创建最大堆 3&#xff09;算法思想 4&a…

Databricks Data Warehouse

Warehouse features 原来的data warehouse痛点&#xff1a; 用例不兼容的支持模型的安全和管理不兼容不相交和重复的数据 ETL workloads Streaming Architecture Data Science and ML

演讲全文|林涛:MongoDB助力智能制造出海控本增效

5月29日-30日在上海世博中心举办的亚马逊云科技中国峰会圆满结束。本文整理了MongoDB北亚区方案与咨询总监林涛在白金讲堂的演讲全文&#xff0c;就《MongoDB助力智能制造出海控本增效》话题与大家共同探讨。 白金讲堂演讲视频 从全球经济竞争的角度看&#xff0c;中国制造业…

原来你长这个样子啊,Java字节码文件

字节码文件 字节码文件是一种二进制文件&#xff0c;扩展名为.class 通过 javac 将源码编译得到&#xff0c;是一种中间形式的代码&#xff0c;这种中间形式的代码让Java有了“一次编译&#xff0c;多次运行”的跨平台特点。 字节码文件的组成 由5大组成部分&#xff1a;基础…

【SQLAlChemy】如何连接数据库?

使用SQLAlChemy连接数据库 导入包 首先&#xff0c;导入创建数据库引擎的包。 from sqlalchemy import create_engine编写数据库配置 SQLALCHEMY_DATABASE_URL "mysql://root:123456789127.0.0.1:3306/tortoise"字段解释&#xff1a; mysql:&#xff1a;这是数…

Python第二语言(七、Python模块)

目录 1. 什么是模块 2. 基本语法 2.1 模块的导入方式 2.2 基本语法 import 模块名 2.3 基本语法 from 模块名 import 功能名 2.4 基本语法as 别名 3. 自定义模块 4. 调用自定义模块时&#xff0c;如何让其模块中的函数不被调用&#xff08;__name__&#xff09; 5. 调…

fl studio怎么设置中文及 2024年最新fl studio选购指南

FL Studio让你的计算机就像是全功能的录音室&#xff0c;漂亮的大混音盘&#xff0c;先进的创作工具&#xff0c;让你的音乐突破想象力的限制。zol提供FL Studio中文版下载。 FL Studio中文版下载软件简介 FL Studio 让你的计算机就像是全功能的录音室&#xff0c;漂亮的大混…

Linux的网络配置

查看网络配置命令 一、查看所有活动的网络接口信息 ifconfig ifconfig 展示的是当前设备正在工作的网卡&#xff08;启动的设备&#xff09; ifconfig -a 展示所有的网络设备 ifconfig ens33 查看指定网卡设备 ifconfig ens33 down 关闭网卡 或者 ifdown ens33 &#xff0…

论文阅读KAN: Kolmogorov–Arnold Networks

学习了最近大热的KAN网络 论文地址&#xff1a;https://arxiv.org/pdf/2404.19756 按我个人读论文的习惯总结了如下几点&#xff1a; 1&#xff0c;背景&#xff1a; 1&#xff09;灵感来源&#xff1a;于Kolmogorov-Arnold表示定理&#xff0c;也就是多变量连续函数可以表…

大模型常用推理参数工作原理

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 do_sample do_sample 参数控制是否使用采样…

戴尔R720服务器(3)组RAID

今天收到7块硬盘&#xff0c;现在共有8块硬盘了&#xff0c;找了个视频学习了怎么使用阵列卡组RAID并记录。 ​​ ‍ 视频参考&#xff1a;【戴尔服务器添加RAID5热备盘hotspare】 ‍ 阵列卡组RAID5 开始 连接iDRAC控制台服务器开机按F2进入BIOS选择Device Settings​ ​​…

知识图谱的应用---智能电网

文章目录 智能电网典型应用 智能电网 智能电网以物理电网为基础&#xff0c;将现代先进的传感测量技术、通讯技术、信息技术、计算机技术和控制技术与物理电网高度集成而形成的新型电网。它以充分满足用户对电力的需求和优化资源配置、确保电力供应的安全性、可靠性和经济性、满…

C++输入输出与IO流

C 输入输出与I/O流 文章目录 C 输入输出与I/O流IO类型与基础特性概念与特性IO状态输出缓冲区 文件输入输出文件模式 string流IO处理中常用的函数及操作符综合练习与demo一、 创建文件并写入二、控制台输入数据并拆分存储三、读写电话簿 IO类型与基础特性 C11标准提供了几种IO处…

【ArcGIS微课1000例】0117:ArcGIS中如何将kml(kmz)文件转json(geojson)?

文章目录 一、kml获取方式二、kml转图层三、图层转json一、kml获取方式 kml文件是一种很常用的数据格式,可以从谷歌地球(googleearth)获取某一个地区的kml范围文件,如青海湖(做好的kml文件可以从配套实验数据包0117.rar中获取)。 二、kml转图层 打开【KML转图层】工具,…

前端项目打包、部署的基础 (vue)

详细请看B站视频 BV19n4y1d7Gr 《禹神&#xff1a;前端项目部署指南&#xff0c;前端项目打包上线》&#xff0c;本博客为自用视频笔记。 目录 项目打包vue打包打包前分析项目请求 本地服务器部署问题 & 解决问题1&#xff1a;刷新页面404问题问题2&#xff1a;ajax请求废…

最新下载:PDFFactoryFinePrint【软件附加安装教程】

简介&#xff1a; pdfFactory是一款无须 Acrobat 创建 Adobe pdf 文件的打印机驱动程序&#xff0c; 提供的创建 PDF 文件的方法比其他方法更方便和高效。 pdfFactory 支持从所有应用程序轻松、可靠地创建 PDF 文件。 支持将单页或两页的文档&#xff0c;直接打印为PDF文件&a…