树与二叉树堆:经典OJ题集

目录

查找值为x的结点:

思路分析:

单值二叉树: 

示例: 

 思路分析: 

相同的树:

示例: 

思路分析: 

二叉树的前序遍历:——使用前序遍历把结点元素放入数组中 

题目:

示例: 

思路分析: 

代码调用图 

通过前序遍历的数组构建二叉树 :

题目:

通过前序遍历的数组"ABD##E#H#CF##G##"构建二叉树

思路分析: 

代码调用图 

总结:


查找值为x的结点:

使用前序、中序后序中的一种对二叉树进行遍历,查找出值为x的结点 

思路分析:

在前中后序中,前序和中序、后序相比在调用递归的次数和返回重复结点的次数较少,所以采取前序遍历进行遍历查找。

查找值为x的结点,可以转变为查找结点以及结点的左右孩子结点的元素是否等于x,而左右孩子结点也有它们的左右孩子,于是最后就将问题化解成了查看当前结点的值是否等于x

  • 而若找到了值等于x的结点,则返回上一个结点,并使用上一个结点的指针指向,且需要使用临时变量接收。
  • 且根据前序遍历的方法,可以将当结点等于NULL作为结束条件,表示当前左右子树走完,当前子树并没有等于x的结点。

单值二叉树: 

题源:965. 单值二叉树 - 力扣(LeetCode) 

  • 如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。只有给定的树是单值二叉树时,才返回 true;否则返回 false

示例: 

 思路分析: 

  • 根据二叉树的结构划分和等值传递原理,本问题可以化解为根结点是否和左右孩子结点有相等的元素,而左右孩子也具有它们自己的左右孩子结点
  • 所以到最后本问题就变成了查看根结点是否等于左孩子结点的元素,是否等于右孩子结点的元素。
  • 也就是说,当根结点元素和左右孩子中的一个孩子结点元素不相同就返回fasle,但是如果相同就需要进入左右孩子结点,去判断它们是否与它们的左右孩子结点元素是否相同。

需要注意的是,有一些结点是只有左孩子结点的,没有右孩子结点,遇到这种情况,也就是当root==NULL时,返回的是true

相同的树:

题源:100. 相同的树 - 力扣(LeetCode) 

  • 给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。
  • 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

示例: 

思路分析: 

需要判断两颗树是否在结构上和元素上相同,那么就需要同时遍历两棵树

而将本问题化解为最简易的问题那便是查看两个根结点是否同时存在,在两个根结点同时存在的时候:

同时判断两个根结点的左右孩子结点又是否同时存在:

  • 如果一方的左孩子结点或者右孩子结点不存在,而另一方的左孩子结点或者右孩子结点存在,那结构就不一样了,所以返回false

若两个根结点的左右孩子结点同时存在,则就同时判断两个根结点的左孩子结点的值是否相同,判断两个根结点的右孩子结点的值是否相同:

  • 如果不相同就返回false
  • 如果相同则进入各自的左右孩子结点进行判断它们的左右孩子结点是否一样。

二叉树的前序遍历:——使用前序遍历把结点元素放入数组中 

题源:144. 二叉树的前序遍历 - 力扣(LeetCode) 

题目:

  • 给你二叉树的根节点 root ,返回它节点值的 前序 遍历

示例: 

思路分析: 

因为需要把结点元素存储到数组中,所以我们需要创建数组,同时数组的大小要等于结点的个数,防止空间浪费和空间不足,因此在外另设一个函数进行递归调用计算树的结点个数以此来创建数组 

  • returnsize 是表是数组的大小 ,a是数组名

  • 再创建一个函数用来递归使用 

因为采取了前序遍历进行存储,所以利用了前序遍历,且直接将原先前序遍历的打印变成了将元素存储到数组内 

原前序遍历:树与二叉树堆:链式二叉树的实现-CSDN博客

代码调用图 

通过前序遍历的数组构建二叉树 :

题目:

通过前序遍历的数组"ABD##E#H#CF##G##"构建二叉树

思路分析: 

1、因为我们要构建二叉树,所以使用创造二叉树的函数 malloc ,因为要把数组的元素交给二叉树的结点,所以需要进行数值的传递。

2、而其次,因为使用的是前序遍历,所以是在前序遍历的方法上进行改造。

3、同时如上图所示,我们构建的二叉树是用 # 来表示最叶子结点的,于是我们可以采用结点是否是 # 来表示递归的返回条件

4、但因为是数组,所以即便是 # 也可能是在数组的中间,所以数组的下标或者说指向数组元素的指针也应该要进行前进。 

  •  a是数组名,pi是指向数组元素的指针可以看作是下标

代码调用图 


总结:

对于二叉树的递归调用而言,本质上分为了三个部分,第一个是判断二叉树逐级返回的条件,一般摆在前端,第二个是要在递归调用中指向的代码程序,第三是递归调用

而二叉树的递归调用一般是以划分成根、左右子树、左右孩子结点之间的关系,来进行大事化小的管理分化。 


 

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

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

相关文章

Gartner发布降低软件供应链安全风险指南

软件供应链攻击已呈三位数增长,但很少有组织采取措施评估这些复杂攻击的风险。这项研究提供了安全和风险管理领导者可以用来检测和预防攻击并保护其组织的三种实践。 主要发现 尽管软件供应链攻击急剧增加,但安全评估并未作为供应商风险管理或采购活动的…

030 - STM32学习笔记 - ADC(四) 独立模式多通道DMA采集

030 - STM32学习笔记 - ADC(四) 独立模式多通道DMA采集 中断模式和DMA模式进行单通道模拟量采集,这节继续学习独立模式多通道DMA采集,使用到的引脚有之前使用的PC3(电位器),PA4(光敏…

js事件流与事件委托/事件代理

1 事件流 事件流分为两步,一是捕获,二是冒泡 1.1 捕获概念 捕获就是从最高层一层一层往下找到最内部的节点 1.2 冒泡概念 捕获到最小节点后,一层一层往上返回,像是气泡从最底部往上冒一样,由于水深不同压强不同&…

如何在工作中好好利用CHAT?

问CHAT:智能微网和综合能源项目实施过程中存在的管理风险和应对措施 CHAT回复:在智能微网和综合能源项目实施过程中,可能存在的管理风险和应对措施主要有以下几个方面: 1. 技术风险:所使用的技术和设备可能还处在研发…

某60区块链安全之薅羊毛攻击实战一学习记录

区块链安全 文章目录 区块链安全薅羊毛攻击实战一实验目的实验环境实验工具实验原理实验内容薅羊毛攻击实战一 实验步骤EXP利用 薅羊毛攻击实战一 实验目的 学会使用python3的web3模块 学会分析以太坊智能合约薅羊毛攻击漏洞 找到合约漏洞进行分析并形成利用 实验环境 Ubun…

[架构之路-255]:目标系统 - 设计方法 - 软件工程 - 软件设计 - 架构设计 - 软件架构风格

前言: 风格是指在不同领域内,人们在表达自己的过程中(如艺术、音乐、文化、时尚、建筑、软件系统等),所选择的、相对稳定的表达方式和特征的总和。在不同领域内都存在着多种不同的风格。 在艺术领域内,也…

vue项目下npm或yarn下安装echarts多个版本

最近在大屏展示的时候,用到了百度的echarts图表库,看完效果图后,又浏览了一下echarts官网案例,大同小异。但是搬砖过程中发现实际效果和demo相差甚远,一番折腾发现,项目中安装的是echarts4.x版本&#xff0…

nginx部署多个vue或react项目

下载nginx(tar.gz) nginx: download(官方地址) 部署nginx # 进入nginx压缩包所在目录 cd /usr/nginx# 解压 tar -zxvf nginx-1.25.3.tar.gz# 安装nginx的相关依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel# 生成Makefile可编译文件 cd /usr/ng…

7、Qt延时的使用

一、说明 平时用到两种延时方式QThread::sleep()和QTimer::singleShot() 1、QThread::sleep() QThread类中如下三个静态函数: QThread::sleep(n); //延迟n秒 QThread::msleep(n); //延迟n毫秒 QThread::usleep(n); //延迟n微妙 这种方式使用简单,但是会阻…

跨链原子交换

原子交换的想法于 2013 年首次在 BitcoinTalk 论坛上提出,它可以实现两个区块链之间的代币交换。 这些交换是原子的,因为双方要么收到对方的硬币,要么都保留自己的硬币。 一方不可能欺骗另一方。 它不依赖任何可信赖的第三方,消除…

3.Ansible的file模块,我最常用的文件操作

1.file 模块的用法 1.1 官方概念 Set attributes of files, symlinks or directories. Alternatively, remove files, symlinks or directories. Many other modules support the same options as the file’ module - including [copy], [template], and [assemble]. For Wi…

在idea中写sql语句,向数据库添加数据时,添加的字符串却显示???,解决方法

这是字符编码的问题 如何解决: 在idea的配置数据库的地方修改下边:mysql8版本和5版本差距不大。 在URL后加?useUnicodetrue&characterEncodingUTF8 例如 原来:String url “jdbc:mysql://localhost:3306/stu”; 改变后:St…

Git——工作区管理

如何管理工作目录,以便用户可以更高效地新建提交。如何在处理工作区和暂存区文件的过程中修复错误,以及如何修复最近一次提交记录中的问题;同时还会了解到如何安全地使用暂存机制和多个工作目录处理工作流中的中断问题。 主要内容有以下几点…

vue3高德地图使用,地址搜索,地址逆解析

在vue3项目里使用高德地图 高德地图文档 先在项目的index.html页面里添加一些东西 <script type"text/javascript">window._AMapSecurityConfig {securityJsCode: "xxxxxxxxxxxxx", //高德安全码};</script> <script src"https://…

认识JVM 一个Java文件的JVM之旅

准备 我是一个java文件&#xff0c;如何实现我的功能呢&#xff1f;需要去JVM(Java Virtual Machine)这个地方旅行。 变身 我高高兴兴的来到JVM&#xff0c;想要开始JVM之旅&#xff0c;它确说&#xff1a;“现在的我还不能进去&#xff0c;需要做一次转换&#xff0c;生成c…

Android问题笔记四十八:蓝牙obtainMessage数据传输部分数据丢失乱序问题

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

《算法通关村——解析堆在合并K个排序链表的应用》

《算法通关村——解析堆在合并K个排序链表的应用》 23. 合并 K 个升序链表 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 示例 1&#xff1a; 输入&#xff1a;lists [[1,4,5],[1,3,4],[2…

万界星空科技/仓库管理WMS系统/免费仓库管理系统

仓库管理&#xff08;仓储管理&#xff09;&#xff0c;指对仓库及仓库内部的物资进行收发、结存等有效控制和管理&#xff0c;确保仓储货物的完好无损&#xff0c;保证生产经营活动的正常进行&#xff0c;在此基础上对货物进行分类记录&#xff0c;通过报表分析展示仓库状态、…

esp32-s3部署yolox_nano进行目标检测

ESP32-S3部署yolox_nano进行目标检测 一、生成模型部署项目01 环境02 配置TVM包03 模型量化3.1预处理3.2 量化 04 生成项目 二、烧录程序 手上的是ESP32-S3-WROOM-1 N8R8芯片&#xff0c;整个链路跑通了&#xff0c;但是识别速度太慢了&#xff0c;20秒一张图&#xff0c;所以暂…

AI生成的图片有版权了

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 把发到小红书的AI图片搬运到百家号&#xff0c;然后被起诉了! 长知识了&#xff0c;原来AI生成的图片也有版权了&#xff0c;AI生成图片著作权第一案判了&#xff0c;这绝对是一件划时代事情&…