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

news2024/11/30 14:36:23

前言

大家好吖,欢迎来到 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)题目完整代码

在这里插入图片描述

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

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

相关文章

.NET 7 创建Android项目 (拥有原生的界面设计能力,比MAUI更好的性能)

vs2022默认移动开发使用的是maui项目模板,maui确实有很多亮点,就是对比android原生项目性能还需要优化,特别是启动app时无法达到秒开。后来发现vs2022中依然可以直接创建android项目,性能和原生Android基本一致。 1、搜索模板 dot…

办理的流量卡怎么判断是否激活成功?看实名认证还是看充值?

很多朋友可能都会有一个疑问,在网上购买的流量卡怎么才算是激活成功呢?是实名之后就算激活成功,还是需要充值使用才算激活成功呢?这篇文章带大家一块儿来了解一下。 ​  可能很多朋友都会有一个疑问,当你收到流量卡&…

Python开源项目GPEN——人脸重建(Face Restoration),模糊清晰、划痕修复及黑白上色的实践

无论是自己、家人或是朋友、客户的照片,免不了有些是黑白的、被污损的、模糊的,总想着修复一下。作为一个程序员 或者 程序员的家属,当然都有责任满足他们的需求、实现他们的想法。除了这个,学习了本文的成果,或许你还…

Leetcode刷题详解——被围绕的区域

1. 题目链接:130. 被围绕的区域 2. 题目描述: 给你一个 m x n 的矩阵 board ,由若干字符 X 和 O ,找到所有被 X 围绕的区域,并将这些区域里所有的 O 用 X 填充。 示例 1: 输入:board [["…

漏洞分析 | 漏洞调试的捷径:精简代码加速分析与利用

0x01前言 近期,Microsoft威胁情报团队曝光了DEV-0950(Lace Tempest)组织利用SysAid的事件。随后,SysAid安全团队迅速启动了应急响应,以应对该组织的攻击手法。然而,在对漏洞的分析和复现过程中&#xff0c…

rabbitmq 集群搭建

RabbitMQ集群介绍 RabbitMQ集群是一组RabbitMQ节点(broker)的集合,它们一起工作以提供高可用性和可伸缩性服务。 RabbitMQ集群中的节点可以在同一物理服务器或不同的物理服务器上运行。 RabbitMQ集群的工作原理是,每个节点在一个…

语音识别芯片NRK3301在智能茶吧机的应用

传统的饮水机传大多只能提供热水和冷水,而智能茶吧机则是一款集合了热饮水机、煮茶器、泡茶壶等多种功能于一体的多功能生活电器。它不仅具备了传统饮水机的所有功能,还可以根据不同的需求,提供多种水温的饮水方式;还具备了煮茶和…

打开IE浏览器

原文地址:https://www.xiaoheiwoo.com/windows-11-internet-explorer/#:~:text%E5%A6%82%E4%BD%95%E5%9C%A8%20Windows11%20%E4%B8%AD%E5%90%AF%E7%94%A8%20IE%E6%B5%8F%E8%A7%88%E5%99%A8%E7%9A%843%E7%A7%8D%E6%96%B9%E6%B3%95%201%20%E6%96%B9%E6%B3%95%E4%B8%80…

系列九、对象的生命周期和GC

一、堆细分 Java堆从GC的角度还可以细分为:新生代(eden【伊甸园区】、from【幸存者0区】、to【幸存者1区】)和老年代。 二、MinorGC的过程 复制>清空》交换 1、eden、from区中的对象复制到to区,年龄1 首先,当eden区…

C#开发的OpenRA游戏之世界存在的属性RenderDebugState(5)

C#开发的OpenRA游戏之世界存在的属性RenderDebugState(5) 前面分析过一个调试的属性,在这里分析另外一个属性,这个属性就是RenderDebugState,它就是用来显示渲染的信息。 跟前面的分析规则可知,属性都是有一个信息类和操作类组成。 在这里信息类叫RenderDebugStateInfo…

指针数组和数组指针的理解(个人理解版)

指针数组和数组指针的形式 int *p[3] // 指针数组 int (*p)[3] // 数组指针指针数组和数组指针的理解 1.指针数组 int *p[3] 首先找到变量p, (1)先与[]结合看(因为[]优先级比*高),也就是p[3]&#…

2023亚太杯数学建模思路 - 案例:FPTree-频繁模式树算法

文章目录 算法介绍FP树表示法构建FP树实现代码 建模资料 ## 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法,就是频繁模式树算法&#xff0c…

抖音小程序开发:疫苗预约系统的技术实现

在疫苗接种的背景下,借助抖音小程序,可以更好地整合用户社交信息和提供便捷的疫苗预约服务。 一、疫苗预约系统的需求分析 在开发抖音小程序疫苗预约系统之前,首先需要进行详细的需求分析。系统应该具备用户注册、疫苗信息展示、预约功能、…

前端安全策略保障

文章目录 前言后台管理系统网络安全XSSCSRFSQL注入 后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:前端系列文章 🐱‍👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。(如果出…

Nerf相关、公式

在3D重建领域,这幅图怎么理解 这张图展示的是“体素剪枝(Voxel Pruning)”在3D重建中的应用,这是一种利用稀疏性(Sparsity)来优化3D数据存储和处理的技术。体素剪枝的目的是为了降低存储需求和提高计算效率…

前端界面网页截图(干货)

如果可以实现记得点赞分享,谢谢老铁~ 看了一些谷歌插件,可以对网页进行局部截图或者是整个网页截图,于是想着弄个demo,关于前端的截图。最后选择了 html2canvas 1.下载安装包 Install NPM npm install --save html2canvas或者…

隐私协议 Secret Network 宣布使用 Octopus Network 构建的 NEAR-IBC 连接 NEAR 生态

2023年11月 NearCon2023 活动期间,基于 Cosmos SDK 构建的隐私协议 Secret Network,宣布使用 Octopus Network 开发的 NEAR-IBC,于2024年第一季度实现 Secret Network 与 NEAR Protocol 之间的跨链交互。 这将会是Cosmos 生态与 NEAR 之间的首…

大模型幻觉成应用落地难题 最新评测文心一言解决幻觉能力最好文心一言解决幻觉能力最好 或成产业应用首选

“林黛玉倒拔垂杨柳”、“月球上面有桂树”、“宋江字武松”……相信经常使用大语言模型都会遇到这样“一本正经胡说八道”的情况。这其实是大模型的“幻觉”问题,是大模型行业落地的核心挑战之一。例如幻觉会影响生成内容的可靠性,对于法律、金融、医疗…

通用人工智能:迈向智能革命的下一步

原创 | 文 BFT机器人 AGI,全称为Artificial General Intelligence,中文翻译为“通用人工智能”,亦被称作强AI,是人工智能研究领域长期探讨的重要议题。此概念指的是在人类可能涉及的所有专业领域内,具备与人类智慧相当…

搜维尔科技:业内普遍选择Varjo头显作为医疗VR/AR/XR解决方案

Varjo 的人眼分辨率混合现实和虚拟现实头显将医疗专业人员的注意力和情感投入提升到更高水平。借助逼真的 XR/VR,医疗和保健人员可以为最具挑战性的现实场景做好准备! 在虚拟、增强和混合现实中进行最高水平的训练和表现 以逼真的 3D 方式可视化医疗数据…