当前位置: 首页 > 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;在 “线…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...