【C++&数据结构】二叉树(结合C++)的经典oj例题 [ 盘点&全面解析 ](24)

前言

大家好吖,欢迎来到 YY 滴数据结构系列 ,热烈欢迎! 本章主要内容面向接触过C++的老铁
主要内容含:
在这里插入图片描述

欢迎订阅 YY滴 数据结构 专栏!更多干货持续更新!以下是传送门!

目录

  • 一.二叉树创建字符串
    • 1)题目介绍&oj链接
    • 2)题目逐过程分析&完整代码
  • 二.给定一个二叉树, 找到该树中两个指定节点的最近公共祖先
    • 1)题目介绍&oj链接
    • 2)题目逐过程分析
    • 3)题目完整代码
    • 4)方法2:引入栈存储【查找路径】,暴力求解
    • 5)方法2的完整代码
  • 三.二叉树搜索树转换成排序双向链表
    • 1)题目介绍&oj链接
    • 2)题目逐过程分析
    • 3)题目完整代码
  • 四.根据一棵树的前序遍历与中序遍历构造二叉树
    • 1)题目介绍&oj链接
    • 2)题目逐过程分析
    • 3)题目完整代码
    • 4)对比同类型题目:"根据一棵树的中序遍历与后序遍历构造二叉树"
  • 五.不使用递归,利用【迭代法】实现“前序遍历”
    • 1)题目介绍&oj链接
    • 2)题目逐过程分析
    • 3)题目完整代码

一.二叉树创建字符串

1)题目介绍&oj链接

在这里插入图片描述

  • 题目链接:https://leetcode.cn/problems/construct-string-from-binary-tree/

2)题目逐过程分析&完整代码

  • 主要思路是通过 前序遍历 (根->左子树->右子树)方式遍历二叉树
  • 我们可以利用 容器string += 追加字符【( 】【 )】
  • 于是我们得到下面所示基本代码
    在这里插入图片描述
    在这里插入图片描述
  • 注意点,题目的要求:转换后的结果如果右子树为空,则可以省略如果左子树为空,右子树不为空,则不省略 ,如下图所示:在这里插入图片描述
  • 所以我们要在基础代码的基础上根据情况分类加上限定条件
  • 可以利用上 【||】自左向右进行判断 的性质
  • 分为以下三种情况(情况1&2可以合并成一种)
    1. 左子树为空,走【||】判断,右子树不为空——>打印左子树空括号
    2. 左子树不为空,直接进——>打印左子树括号+节点
    3.右子树不为空,直接进——>打印右子树括号+节点
  • (PS:由于加上了条件限制:左右均为空时,递归函数直接返回,不会打印空括号)
  • 最终代码如下图所示
    在这里插入图片描述

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

1)题目介绍&oj链接

在这里插入图片描述

  • 题目链接:https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/

2)题目逐过程分析

  • 公共祖先的特征:一个节点在我的左子树,一个节点在我的右子树,则我就是公共祖先
  • 因此我们需要利用到【查找】功能(前序遍历:根—>左子树—>右子树)
    在这里插入图片描述
  • 接下来我们进一步进行程序设计:
  • 首先明确传入的参数,1.树的根节点 2.节点1 3.节点2
  • 先得到一种情况:根节点为节点1/节点2,直接返回公共祖先
    在这里插入图片描述
  • 之后需要对节点1和节点2是在左子树还是右子树进行 初步判断 ;设置四个参数,分别为节点在左还是在右的返回值;利用下图所示简单逻辑判断,快速得到返回值
    在这里插入图片描述
  • 开始进行递归判断;两个节点,同时在左时,则继续往左走;同时在右时,继续往右走;直到一左一右,递归结束;
    在这里插入图片描述

3)题目完整代码

在这里插入图片描述

4)方法2:引入栈存储【查找路径】,暴力求解

  • 将根元素入栈
  • 根据前序遍历向下探测查找元素,并分别入栈
  • 如果没找到元素(root为空时)return false,则跳出递归,将元素出栈(pop)
  • 经过FindPath这一过程以后,stack path中存储的是该节点TreeNode的路径
    在这里插入图片描述
  • 最后分别对两个栈中存储的路径大小进行比较,大的路径挨个出栈,直到大小相同
  • 同时出栈,最后返回公共祖先
    在这里插入图片描述

5)方法2的完整代码

在这里插入图片描述

三.二叉树搜索树转换成排序双向链表

1)题目介绍&oj链接

在这里插入图片描述

  • 题目链接:https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5?tpId=13&&tqId=11179&rp=1&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking

2)题目逐过程分析

  • 解题关键性质:二叉搜索树 中序遍历(左子树->根->右子树) 时,返回节点的顺序是 从小到大
  • 解题思路分析:
  • 核心:如果我们能够通过 中序遍历 该二叉搜索树,并且将返回的节点按顺序存入vector中,最后再将相邻元素两两连接,则也可以实现双向链表
  • 但是题目中要求如下所示:
    在这里插入图片描述
  • 于是我们 只能 调节结点指针 角度出发
  • 结合上面的【核心】,我们知道要调节结点指针的指向——也就是 在中序遍历的过程中,让节点的左指针指向它的 前一个节点,右指针指向它的 下一个节点
    在这里插入图片描述
  • 但是我们最多只能通过 前后指针法 ——> 来让节点的左指针指向它的前一个节点(上图中6—>4),至于让右指针指向它的后一个节点则做不到(上图中6—>8);
  • 但是我们可以 让前一组的右指针指向节点(4—>6)
    在这里插入图片描述
  • 最后就是要找到 中序遍历 中的第一个节点head,不停地找左子树直到其为空即可
    在这里插入图片描述

3)题目完整代码

在这里插入图片描述

四.根据一棵树的前序遍历与中序遍历构造二叉树

1)题目介绍&oj链接

在这里插入图片描述

  • 题目链接:https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/

2)题目逐过程分析

  • 这道题解题关键步骤在于: 利用 前序遍历 确定根,利用 中序遍历 分割左右区间
    在这里插入图片描述
    在这里插入图片描述
  • 根据以上核心思路:
  1. 我们需要一个 整型prei 在前序遍历中确定根—— prei记得要初始化成0
  2. 我们需要一个 节点rooti 在中序遍历中分割区间;
  • 程序设计板块:
    1. (第一次进入函数时)创建与前序遍历对应的根节点
    在这里插入图片描述
    2. 利用while循环,在中序遍历中找到与 preorder[i] 对应的 节点rooti
    在这里插入图片描述
    3. 前序遍历中确定下一个根
    在这里插入图片描述
    4. 根据第2步找到的rooti, 划分左右区间 ,在左子树与右子树中进行递归操作
    在这里插入图片描述

3)题目完整代码

在这里插入图片描述

4)对比同类型题目:“根据一棵树的中序遍历与后序遍历构造二叉树”

  • 后序遍历和前序遍历不同点在于,其访问根的先后顺序完全颠倒

  • 因此,大体思路与【根据一棵树的中序遍历与后序遍历构造二叉树】一样:
    利用 后序遍历 确定根,利用 中序遍历 分割左右区间

  • 具体操作:

  • 【我们将prei初始化成数组大小,prei–】
    在这里插入图片描述

  • 题目链接:https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/

五.不使用递归,利用【迭代法】实现“前序遍历”

1)题目介绍&oj链接

在这里插入图片描述

  • 题目链接:https://leetcode.cn/problems/binary-tree-preorder-traversal/

2)题目逐过程分析

  • 核心思路:由于题目要求采用迭代法,所以我们要引入 【栈】
  • 概述:入手点应该放在 当前节点cur的变化 (1) cur一直找左子树入栈 (2) cur找到空时,会开始出栈顶元素并压入vector中 (3) cur重新指向被出的栈顶元素的右子树根节点(重复上述过程直到cur为空且栈为空)
    >![在这里插入图片描述](https://img-blog.csdnimg.cn/69c6dbd2c0aa448bb8a8827a97dff804.png)
  • 程序设计板块:
    1. 设置一个栈,设置一个待返回的数组vector,设置一个指针cur指向当前节点
    在这里插入图片描述
    2. 利用一个while循环,不停地取左树节点,并且 将节点压入栈中
    在这里插入图片描述
    3. 取完左路节点时(当前所在节点为空时),将栈中的元素出栈的同时把节点的值push进要返回的数组vector中,随后访问其右路 (当前节点指向其右路节点)
    在这里插入图片描述

4. 迭代法核心:用一个 while循环 嵌套 (跳出循环的条件:当前节点为空,且栈为空

  • (访问右路的过程,即是重复过程1的子问题如下图所示)
    在这里插入图片描述

3)题目完整代码

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用封面预测书的价格【图像回归】

今天,我将介绍计算机视觉的深度学习应用,用封面简单地估算一本书的价格。 我没有看到很多关于图像回归的文章,所以我为你们写这篇文章。 距离我上一篇文章已经过去很长时间了,我不得不承认,作为一名数据科学家&#x…

Flowable 定时器事件

# 注意数据库时区的配置,如果差8小时配置成Asia/Shanghai spring.datasource.urljdbc:mysql://localhost:3306/flowable660?serverTimezoneAsia/Shanghai&nullCatalogMeansCurrenttrue# 开启定时任务功能 flowable.async-executor-activate: true一&#xff1a…

android studio编译SDL so库

一、下载源码 SDL官网 二、解压,拷贝android项目,并重新命名 2.1、解压 2.2,重命名项目名称(androidSDL)AndroidSDL Github 三、导入头文件和源文件,修改android.mk文件 3.1、在jni目录下创建SDL2文件…

腾讯云服务器可用区是什么意思?

腾讯云服务器可用区是什么意思?云服务器可用区如何选择?可用区是指在同一个地域内电力和网络相互独立的区域,可用区可以做到故障隔离,所以可用区存在的意义在于构建高可用、高容灾应用,将应用部署在不同可用区内&#…

爬虫基础之爬虫的基本介绍

一、爬虫概述 爬虫又称网络蜘蛛、网络机器人,网络爬虫按照系统结构和实现技术,大致可以分为以下几种类型: 通用网络爬虫(Scalable Web Crawler):抓取互联网上所有数据,爬取对象从一些种子 URL…

腾讯云服务器可用区是什么意思?可用区选择方法

腾讯云服务器可用区是什么意思?云服务器可用区如何选择?可用区是指在同一个地域内电力和网络相互独立的区域,可用区可以做到故障隔离,所以可用区存在的意义在于构建高可用、高容灾应用,将应用部署在不同可用区内&#…

【2024全新版】程序员必会英语词汇表

“我英语不好可以学编程吗?” 相信这个问题,困扰着太多想学习编程,但英文不好的同学。 学习编程,常用的单词就那么多,只要把常见的单词学会,你的代码就能写的很6,英 语和编程的关系就是这么纯…

市场研究报告:量子计算将颠覆银行业!

(图片来源:网络) 量子银行将对金融体系产生重大影响,它在量子计算和区块链的基础上建立了一个更快的支付机制,并且通过消除传统点对点支付中常见的中间人,降低了运营成本。 量子计算及其运作机制 中东地区…

利用ffmpeg实现rtmp和rtsp推流

环境说明 windows11 : ffmpeg VLC Linux Unbuntu20.04 : SRS MediaMTX 可选:GStreamer win11下载ffmpeg和ffplay ffmpeg官网 添加环境变量:添加ffmpeg/bin所在的路径。 D:\ffmpeg\ffmpeg-master-latest-win64-lgpl-shared\bin win11查看本机电脑的设备…

JRebel

JRebel 下载: 1.在idea 直接下载 但版本不好控制 2.仓库下载地址:https://plugins.jetbrains.com/plugin/4441-jrebel-and-xrebel/versions/stable 注意版本:2022 .4.1 激活: 打开地址:https://jrebel.qekang.com/ …

英伟达真是赢麻了,深夜推出最强AI芯片霸场 | 百能云芯

10月14日凌晨,英伟达在2023年全球超算大会(Supercomputing Conference,SC)上正式宣布,升级旗舰AI芯片,推出全新的H200芯片,以处理更强大的人工智能系统。包括亚马逊的AWS、Alphabet的Google Clo…

CDP体系化建设1-CDP综述

前言 从CRM到DMP,再到CDP的横空出世,数据产品领域推陈出新的速度也挺快的。 而了解CDP的人可能会说,CDP和BI一样,糅杂了太多东西,都不知道如何概括。 在我看来,CDP也是一个看似简单,但是需要借助…

MYSQL存储引擎和索引

存储引擎 InnoDB(默认) 存储引擎的对比 MYISAM被MangoDB替代了 MEMORY被Redis替代了 索引 是一种高效获取数据的数据结构 索引结构 二叉树,红黑树(都不合适) B树 插入超过5个数,会从中间分裂 B树 …

Qt高级--(2)自定义标题栏

自定义标题栏 功能点 1.标题栏中最外层布局器使用水平布局器。 2.导航按钮、工具按钮和窗口功能按钮都是用水平布局器,边距和间隔可根据实际情况设置。 3.编写 QSS 样式,并将样式设置到窗口控件中。 4.实现最小化、最大化和关闭窗口按钮功能。 5.实现鼠…

可信联邦学习冬令营·成都开营,产学研共促AI人才培养

近年来,国家对于人工智能和数据安全的重视程度不断加强。国务院《新一代人工智能发展规划》中明确提出了加强人工智能领域的基础研究、培养高素质人才、促进产业融合等方面的要求。联邦学习是人工智能和隐私计算核心技术之一,以“数据不动模型动&#xf…

Tomcat web.xml文件中的mime-mapping

在Tomcat安装目录的conf/web.xml文件中&#xff0c;定义了大量的<mime-mapping>元素&#xff0c;例如&#xff1a; 其中<extension>指定了文件的扩展名&#xff0c;<mime-type>指定了mime类型&#xff0c;放在<mime-mapping>元素中&#xff0c;就是将…

APIcloud 【现已更名 用友开发中心】 iOS发版 应用程序请求用户同意访问相机和照片,但没有在目的字符串中充分说明相机和照片的使用。

iOS 审核时 提示 首次安装软件 获取相机 相册 提示信息 怎么修改 我们注意到你的应用程序请求用户同意访问相机和照片&#xff0c;但没有在目的字符串中充分说明相机和照片的使用。 为了解决这个问题&#xff0c;修改应用信息中的目的字符串是合适的。相机和照片的Plist文件&a…

layui表头多出一列(已解决)

问题描述 &#xff1a;layui表头多出来一列&#xff0c;但是表体没有内容&#xff0c;很影响美观。 好像是原本的表格有滚轮&#xff0c;我操作放大之后滚轮没有了&#xff0c;但是滚轮自带的表头样式还在&#xff0c; 之后手动把这个样式隐藏掉了&#xff0c;代码如下&#xf…

iceoryx(冰羚)-简介

概要 RouDi RouDi是Routing and Discovery的缩写。RouDi负责通信设置&#xff0c;但实际上并不参与发布者与订阅者或客户端与服务器之间的通信。鲁迪可以被认为是iceoryx的总机操作员。它的另一个主要任务是设置共享内存&#xff0c;应用程序使用共享内存交换有效负载数据。Ro…

操作系统(五)文件系统和I/O系统

文章目录 前言文件系统文件系统和文件文件描述符目录、文件别名和文件系统分层文件系统目录实现文件别名名字解析&#xff08;路径遍历&#xff09;文件系统挂载文件系统种类 虚拟文件系统文件缓存和打开文件打开文件 文件分配空闲空间管理和冗余磁盘阵列RAID空闲空间管理冗余磁…