当前位置: 首页 > news >正文

Java-数据结构-二叉树-习题(三)  ̄へ ̄

文本目录:

❄️一、习题一(前序遍历非递归):

        ▶ 思路: 

        ▶ 代码: 

 ❄️二、习题二(中序遍历非递归):

         ▶ 思路: 

        ▶ 代码: 

 ❄️三、习题三(后序遍历非递归):

         ▶ 思路: 

        ▶ 代码: 

 ❄️四、习题四(选择题):

     ➷ 选则题一:

      ➷ 选则题二:

       ➷ 选则题三:

        ➷ 选则题四:

        ➷ 选则题五:

❄️五、总结:


❄️一、习题一(前序遍历非递归):

          ☞  题的链接:

                       前序遍历非递归


        ▶ 思路: 

      对于这道题呢,我们不使用递归实现,我们呢需要使用到一种结构——栈。来实现这个前序遍历的操作,因为返回的 List<Integer>  我们呢要把每次的节点的 val 值存放到 List 里面。

     我们先把根节点放入到栈中,之后遍历左子树把其都放到栈中,当 cur 为空的时候,出栈顶节点给到 top 这个临时变量中,把 top.right 给到 cur 节点,并且我们每次入栈的节点的值都要放到List 当中最后返回的是 List 这个数据结构

     我们来看看图是如何进行的:

OK,这个呢就是我们这个题的操作流程了,我们来看看代码是如何编写的: 

        ▶ 代码 

public List<Integer> preorderTraversal(TreeNode root) {List<Integer> ret = new LinkedList<>();if (root == null) {return ret;}Stack<TreeNode> stack = new Stack<>();//先把根节点入进来TreeNode cur = root;while (cur != null || !stack.isEmpty()) {while (cur != null) {//入Listret.add(cur.val);//入栈stack.push(cur);//往左子树遍历cur = cur.left;}//存储栈顶节点TreeNode top = stack.pop();//把栈顶的节点的右子树给到curcur = top.right;}return ret;}

我们的前序遍历的非递归就到这结束了,当然有前序就得有 中序和后序,我们来看看。


 ❄️二、习题二(中序遍历非递归):

          ☞  题的链接:

                      中序遍历的非递归实现


         ▶ 思路: 

    对于我们这个题呢,当我们了解了上面的代码之后呢,就是非常好写了,我们对于前序遍历是:

根   左   右。我们的中序遍历呢是: 左  根  右。所以呢这个题其实就很简单了,我们只需要把我们存储到 List 的代码,改变到我们出栈顶数据之后再存储到 List 当中,并且我们要注意我们存储到List 的 val 值应该是我们出的栈顶的数据 top 的 val 值。

     我们的代码流程和上面的题是差不多的,我们只需要改变 List 的存储顺序就可以了。

     我们来看看代码如何编写:

        ▶ 代码 

public List<Integer> inorderTraversal(TreeNode root) {List<Integer> ret = new LinkedList<>();if (root == null) {return ret;}Stack<TreeNode> stack = new Stack<>();TreeNode cur = root;while (cur != null || !stack.isEmpty()) {while (cur != null) {stack.push(cur);cur = cur.left;}TreeNode top = stack.pop();//我们在这里进行存储到 List 中ret.add(top.val); cur = top.right;}return ret;}

 ❄️三、习题三(后序遍历非递归):

          ☞  题的链接:

                     后序遍历的非递归实现


         ▶ 思路: 

     后序遍历是:左  右  根。我们这个题的代码呢和前面两个遍历是不一样的,这个呢我们需要判断左子树和右子树都为空的情况下,才能把这个节点的值存到 List 当中所以我们不是先出栈,我们需要先 peek 一下栈顶的数据,看是否栈顶数据的右子树是否为空,为空则打印,不为空就把其右子树的节点放到 cur 中 。但是如果这样写呢,会有一些问题,我们一会在看,我们下把我们描述的代码写下:

public List<Integer> postorderTraversal(TreeNode root) {List<Integer> ret = new LinkedList<>();if (root == null) {return ret;}Stack<TreeNode> stack = new Stack<>();TreeNode cur = root;while(cur != null || !stack.isEmpty()) {while(cur != null) {stack.push(cur);cur = cur.left;}TreeNode top = stack.peek();if (top.right == null) {ret.add(top.val);stack.pop();}else {cur = top.right;}}return ret;}

我们来看看这个代码哪里存在问题呢? 

       所以我们需要一个临时变量,用来存储我们要出栈的节点,当我们再次循环的时候,如果 top.right == prev 这个节点,就不会进入出栈的方法中。

那么我们来看看最终的代码是什么样的:

        ▶ 代码 

public List<Integer> postorderTraversal(TreeNode root) {List<Integer> ret = new LinkedList<>();if (root == null) {return ret;}Stack<TreeNode> stack = new Stack<>();TreeNode cur = root;TreeNode prev = null;while (cur != null || !stack.isEmpty()) {while (cur != null) {stack.push(cur);cur = cur.left;}TreeNode top = stack.peek();if (top.right == null || top.right == prev) {ret.add(top.val);stack.pop();prev = top;} else {cur = top.right;}}return ret;}

      到这里呢,我们关于我们前中后序的非递归遍历,就到这里就结束了,我们呢之后来看看几道选择题,这几次做代码题是不是都做腻了,我们来看看新口味:选择题。 也是关于二叉树的。


 ❄️四、习题四(选择题):

     ➷ 选则题一:

某二叉树共有 399 个节点,其中 199 个度为 2 的节点,则该二叉树中叶子节点数为 ( )

A、不存在这样的二叉树

B、200

C、198

D、199

 这个选择题呢,我们使用到的公式是 : n0(度为0的节点个数) = n2(度为2的节点的个数) + 1

这样之后我们这个题就好做了,我们的 叶子节点就是度为0 的节点,所以这个题中的叶子节点数为:n0 = 199 + 1 = 200 个,所以这题我们选择 B。 


      ➷ 选则题二:

在具有 2n 个节点的完全二叉树中,叶子结点的个数为 ( )

A、n

B、n + 1

C、n - 2

D、n / 2

     这道题呢,我们呢要考虑这个总结点个数呢是奇数还是偶数的情况下,是不一样的结果的。我们的总结点是:n0 + n1 + n2 这些节点的总数。

     当我们的总结点个数为偶数的时候呢,我们的 n1 为 1 ,

     当我们的总结点的个数为奇数的时候呢,我们的 n1 是 0。

注意:这道题我们还是需要借助 n0 = n2 + 1 这个公式

我们再来看看总结点数为奇数的情况是什么样的:   

     我们再回到这道题中,我们的总结点数为 2n 是偶数,所以这里我们使用偶数的情况进行计算,

就可以得出我们的 叶子结点(n0) 是 n 个。


       ➷ 选则题三:

我们来举一个总结点数为奇数的情况是什么样的:

                                                   一个总结点为 767 个节点的完全二叉树,其 叶子节点 个数为 ( )

A、383

B、384

C、385

D、386

   我们来看看这道题是怎样做的,我们的这个题的节点数为 767 是奇数个,所以我们使用 奇数的节点个数来计算 叶子节点。

767 = n0 + n2

767 = n0 + n0 - 1

766 = 2n0

n0 = 383

 由此可知,我们这个题的 叶子节点 的个数就是 383 个。所以我们选择 A。


        ➷ 选则题四:

  接下来我们来看看对于遍历的题:

设一颗二叉树的中序遍历为:badce,后序遍历为:bdeca,则二叉树的前序遍历是什么 ( )

A、adbce

B、decab

C、debca

D、abcde

    这种题呢,我们需要记住 前中后序  遍历的顺序,用给的两个遍历呢去还原二叉树,之后再遍历我们需要的那个二叉树就可以了。 我们来看看这道题,

    我们的 后序遍历是:左  右  根所以我们的后序遍历的最后一个值就是根节点之后到中序遍历:左   根   右去寻找根节点,把左子树和右子树分割出来,再去后序遍历中寻找 右子树的根节点,再到中序中寻找,循环执行这个操作,直至后序没有节点,这个呢就是我们的上个博客中的编码题,变成了我们的选择题。

     

     这个就是这个题的二叉树了,之后我们再对其进行前序遍历就可以了,最后我们的到 前序遍历为:abcde。所以这道题就选择 D。


        ➷ 选则题五:

某二叉树的后序遍历和中序遍历的序列是相同的,均为ABCDEF,则按照 层序遍历是 ( )

A、FEDCBA

B、CBAFED

C、DEFCBA

D、ABCDEF

   这道题呢,我们要知道我们的 后序遍历是: 左  右  根。中序遍历是:左  根  右。

   他们的遍历顺序是不同的,所以要是想要它们的遍历循序是一样的话,我们的右子树是没有节点的,这样呢结果就可以是一样的了,当我们的右子树为空后序遍历就是:先左再根。中序遍历就是:先左再根。就是一样的了。比如这道题的二叉树就可以得到这样的:

所以我们可以得知,我们的层序遍历在这里就是:FEDCBA 。所以这道题我们选择 A。


❄️五、总结:

          OK,我们的这个关于我们的二叉树的习题三但这里就结束了,同时到这里呢,我们的

数据结构 ——二叉树 也就结束了,之后呢我们进入到新的章节了,欲知后事如何,且听下回分说

拜拜啦~~~我们下篇博客再见。

相关文章:

Java-数据结构-二叉树-习题(三)  ̄へ ̄

文本目录&#xff1a; ❄️一、习题一(前序遍历非递归)&#xff1a; ▶ 思路&#xff1a; ▶ 代码&#xff1a; ❄️二、习题二(中序遍历非递归)&#xff1a; ▶ 思路&#xff1a; ▶ 代码&#xff1a; ❄️三、习题三(后序遍历非递归)&#xff1a; ▶ 思路&#xff1a; …...

SpringBoot+Aop+注解方式 实现多数据源动态切换

整体思路&#xff1a; 引入基本依赖SpringBootAopMySqlMyBatislombok在配置文件中配置多个数据源创建数据源配置类用于读取配置编写用于标识切换数据源的注解创建数据源切换工具类DataSourceContextHolder编写切面类用于在注解生效处切换数据源编写配置类&#xff0c;加载数据…...

企业如何高效应对多类型知识产权事务的复杂挑战?

随着企业的发展和创新活动的不断推进&#xff0c;越来越多的企业拥有了大量的专利、商标和软著等知识产权&#xff0c;这些不仅关乎企业的技术创新成果&#xff0c;更直接影响到企业的品牌价值和市场竞争力。然而&#xff0c;当企业拥有多件知识产权时&#xff0c;复杂的申请、…...

openeuler22.03 LTS 源码编译安装nginx1.22.1

openeuler22.03 LTS 源码编译安装nginx1.22.1 下载安装包 #官网下载nginx1.22.1 wget http://nginx.org/download/nginx-1.22.1.tar.gz安装依赖包 #安装依赖包&#xff0c;NGINX是C语言写的&#xff0c;pcre-devel支持正则表达式&#xff0c;openssl 开启加密 [rootproxy ~]…...

图片压缩工具免费怎么找?归纳了这几个压缩工具

有哪些图片压缩工具免费&#xff1f;在数字化时代&#xff0c;图像已成为我们生活中不可或缺的一部分。无论是网站设计、社交媒体分享还是文件传输&#xff0c;高质量的图片都扮演着重要的角色。但高质量往往意味着大文件体积&#xff0c;这可能会导致加载速度变慢或存储空间不…...

【Kubernetes知识点】解读HPA的 thrashing(抖动)问题

【Kubernetes知识点】解读HPA的 thrashing&#xff08;抖动&#xff09;问题 目录 1 概念 1.1 什么是 Thrashing 现象&#xff1f;1.2 HPA 中 Thrashing 产生的原因1.3 解决 Thrashing 的优化措施 1.3.1 设置合适的阈值1.3.2 使用自定义指标和基于负载的自动扩缩1.3.3 增加扩…...

Unity 设计模式 之 结构型模式 -【装饰者模式】【外观模式】【享元模式】【代理模式】

Unity 设计模式 之 结构型模式 -【装饰者模式】【外观模式】【享元模式】【代理模式】 目录 Unity 设计模式 之 结构型模式 -【装饰者模式】【外观模式】【享元模式】【代理模式】 一、简单介绍 二、装饰者模式&#xff08;Decorator Pattern&#xff09; 1、什么时候使用装…...

Linux上Qt安装相关的内容及在QtCreator使用QChart模块需要的配置

引言 下面是Ubuntu上Qt安装相关的内容及在QtCreator使用QChart模块需要的配置。 关于Qt安装及环境 Qt的模块 查看已经安装的模块 sudo apt search qt5-安装新的模块 sudo apt install qt5-svg # 安装Qt SVG模块3.查看qt已经安装了哪些模块 dpkg -l | grep libqt安装qt,…...

lettuce引起的Redis command timeout异常

项目使用Lettuce&#xff0c;在自己的环境下跑是没有问题的。在给客户做售前压测时&#xff0c;因为客户端环境比较恶劣&#xff0c;service服务和中间件服务不在同一机房。服务启动后不一会就会出现Redis command timeout异常。 经过差不多两周的追查&#xff0c;最后没办法把…...

【Hadoop】一、Hadoop入门:基础配置、集群配置、常用脚本

基础设置 网络设置 创建好一个 centos 虚拟机&#xff0c;修改网络配置文件&#xff1a; /etc/sysconfig/network-scripts/ifcfg-ens33修改 BOOTPROTO 为 static 以及添加 IPADDR、GATEWAY、DNS1 TYPE"Ethernet" PROXY_METHOD"none" BROWSER_ONLY&quo…...

Ollama:本地运行大模型【含UI界面】

文章目录 Ollama 简介安装 ollamaWindows 安装Docker 安装其它平台安装支持的模型模型清单模型参数与运行内存快速启动 llama 模型llama 模型介绍运行 llama3.1 模型通过 HTTP API 访问ollama 命令语法常用示例特别示例自定义模型创建 Modelfile创建模型并运行集成 Web 页面Ope…...

【论文阅读】Grounding Language with Visual Affordances over Unstructured Data

Abstract 最近的研究表明&#xff0c;大型语言模型&#xff08;llms&#xff09;可以应用于将自然语言应用于各种各样的机器人技能。然而&#xff0c;在实践中&#xff0c;学习多任务、语言条件机器人技能通常需要大规模的数据收集和频繁的人为干预来重置环境或帮助纠正当前的…...

目标检测:滑块验证

最近在做一些爬虫相关的任务&#xff0c;有时候在登录时候需要去做滑块验证&#xff0c;刚好自己是做AI这一块得&#xff0c;就想着使用目标检测去做检测&#xff0c;然后绕过滑块。...

Unreal Engine 5 C++: 编辑器工具编写入门01(中文解释)

目录 准备工作 1.创建插件 2.修改插件设置 快速资产操作&#xff08;quick asset action) 自定义编辑器功能 0.创建编辑器button&#xff0c;测试debug message功能 大致流程 详细步骤 1.ctrlF5 launch editor 2.创建新的cpp class&#xff0c;derived from AssetAction…...

力扣上刷题之C语言实现-Day2

一. 简介 本文记录一下&#xff0c;力扣C语言逻辑题。主要涉及 数组方面的知识。 二. 涉及数组的 C语言逻辑题 1. 两数之和 给你一个下标从 1 开始的整数数组 numbers &#xff0c;该数组已按 非递减顺序排列 &#xff0c;请你从数组中找出满足相加之和等于目标数 target…...

Visual Studio 2022 - QT 环境中文字符乱码问题

Visual Studio 2022 - QT 环境中文字符乱码问题 一、Visual Studio 2022 - Qt 环境 在 QT 中使用中文字符串常会出现乱码现象&#xff0c;如下&#xff1a;以下提供了几个解决方法&#xff0c;仅供参考 QString str "百香果真是一直可爱的小猫咪"; qDebug() <…...

获得ASPICE认证需要满足哪些条件?

要获得ASPICE认证&#xff0c;需要满足以下条件&#xff1a; ( 要明确的是&#xff1a;在ASPICE行业中专业来说&#xff0c;ASPICE项目是没有认证&#xff0c;而只有评估。不过&#xff0c;为了方便沟通&#xff0c;人们常将这一评估过程称为认证。&#xff09; 一、基础条件…...

鸿蒙_异步详解

参考详细链接&#xff1a; 鸿蒙HarmonyOS异步并发开发指南...

linux日志查询搜索view

view 命令实际上是 vim 编辑器的一个只读模式。当你使用 view 打开一个文件时&#xff0c;实际上是在用 vim 查看该文件&#xff0c;只是不能编辑内容。因此&#xff0c;view 下的搜索操作与 vim 类似。 以下是如何在 view 模式下进行搜索&#xff1a; 启动 view 并打开文件&a…...

性能测试工具——JMeter

目录 一、JMeter介绍 1、下载安装JMeter 2、打开JMeter 方式一&#xff1a; 方式二&#xff1a; 3、JMeter基础设置 4、JMeter基本使用流程 &#xff08;1&#xff09;启动JMeter &#xff08;2&#xff09;在测试计划下添加线程组 &#xff08;3&#xff09;在 “线…...

1.《DevOps》系列K8S部署CICD流水线之部署K8S集群~version1.28.2

架构 服务器IP服务名称硬件配置192.168.1.100k8s-master8核、16G、120G192.168.1.101k8s-node18核、16G、120G192.168.1.102k8s-node28核、16G、120G192.168.1.103nfs2核、4G、500G 操作系统&#xff1a;Rocky9.3 后续通过K8S部署GitLab、Harbor、Jenkins 一、环境准备 关…...

c/c++八股文

c基础 一、指针和引用的区别 定义方式: 指针是通过 * 操作符定义的变量,用于存储另一个变量的地址。例如: int* p &x;引用是通过 & 操作符定义的别名,直接引用另一个变量。例如: int& r x; 内存占用: 指针是一个独立的变量,占用一定的内存空间。引用不是独立的…...

Docker配置代理解决pull超时问题

操作系统: CentOS Linux 8 Docker版本: 26.1.3 前置&#xff1a;你需拥有&#x1f431; 1. 配置 proxy.conf 1.1 创建配置文件目录 创建 docker.service.d&#xff0c;进入到 docker.service.d 中打开 proxy.conf (没有文件打开会自动创建)。 注意&#xff1a;每个人的路径可…...

ECharts的特点

ECharts是一款基于JavaScript的数据可视化图表库&#xff0c;由百度团队开源&#xff0c;并于2018年初捐赠给Apache基金会&#xff0c;成为ASF孵化级项目。ECharts提供了直观、生动、可交互、可个性化定制的数据可视化图表&#xff0c;广泛应用于数据分析和展示领域。以下是关于…...

JVM OutOfMemoryError 与 StackOverflowError 异常

目录 前言 堆溢出 虚拟机栈和本地方法栈溢出 方法区溢出 前言 JVM规范中规定, 除了程序计数器之外, 其他的运行时数据区域, 例如堆栈, 方法区, 都会出现OutOfMemoryError异常. 那么到底是怎么样的代码, 才会引起堆溢出, 栈溢出, 或者是方法区的溢出呢? 如果遇到了又该如何…...

linux防火墙学习

Linux 防火墙配置&#xff08;iptables和firewalld&#xff09; Linux 防火墙配置&#xff08;iptables和firewalld&#xff09;_iptables配置文件位置-CSDN博客 Linux查看防火墙状态及开启关闭命令_linux 查看防火墙-CSDN博客...

Java面试篇基础部分- Java中的阻塞队列

首先队列是一种前进后出的操作结构,也就是说它只允许从队列前端进入,从队列后端退出。这个前端和后端看个人如何理解,也就是通常所说的入队和出队,队头和队尾。 阻塞队列和一般队列的不同就在于阻塞队列是可以阻塞的,这里所说的并不是说队列中间或者队头队尾被拦截了,而是…...

Go语言并发编程之Channels详解

并发编程是Go语言的一大特色,而channel(通道)则是Go语言中用于实现并发的核心工具之一。它源于CSP(Communicating Sequential Processes)的概念,旨在让多个goroutine之间能够高效地进行通信和同步。本文将深入探讨channel的用法、原理和最佳实践,通过丰富的示例代码和详…...

【Java集合】LinkedList

概要 LinkedList是用链表结构存储数据的&#xff0c;很适合数据的动态插入和删除&#xff0c;随机访问速度比较慢。另外&#xff0c;他还提供了 List 接口中没有定义的方法&#xff0c;专门用于操作表头和表尾元素&#xff0c;可以当作堆栈、队列和双向队列使用。 链表 链表是…...

大模型之基准测试集(Benchmark)-给通义千问2.0做测评的10个权威测基准测评集

引言 在去年(2023)云栖大会上&#xff0c;阿里云正式发布千亿级参数大模型通义千问2.0。据现场介绍&#xff0c;在10个权威测评中&#xff0c;通义千问2.0综合性能超过GPT-3.5&#xff0c;正在加速追赶GPT-4。以下是通义千问在MMLU、C-Eval、GSM8K、HumanEval、MATH等10个主流…...