链式二叉树,递归的暴力美学

目录

 1.链式二叉树概念

2.链式二叉树的实现

3.先序遍历

4.中序遍历

5.后序遍历

6.求链式二叉树的结点个数

7.链式二叉树的叶子结点个数

8.求二叉树的k层的结点个数

9.链式二叉树求深度

10.求值为x的结点

11.链式二叉树的销毁

12.二叉树的层序遍历

13.判断二叉树是否为完全二叉树


 1.链式二叉树概念

链式二叉树和名字一样,是使用链式结构实现的二叉树,结点之间使用指针连接起来的。之前的二叉树是使用顺序结构进行存储的,不同于顺序存储,链式结构可以将各结点之间的关系表示清晰。

2.链式二叉树的实现

二叉树,首先肯定要有根节点的,然后是左右两个孩子结点,分别叫做left和right即可,通过一个结构体来实现链式二叉树。

 如图所示,一个链式二叉树的结点就是实现好了。

我们要自己手动将结点连接起来,这就实现了一个完全二叉树。

3.先序遍历

简单的几行代码就实现好了,这就是递归的魅力所在。

接下来分析一下,

递归是一定要有终止条件的,如果没有终止条件的话递归就会陷入死循环,并且占用的大量的函数栈帧,先序遍历的终止条件就是根节点为NULL,此时就结束递归,不会进入到后面的步骤,如果这个根结点不是空指针,那就打印这个结点的data,然后进入左子树进行先序遍历,如果左子树的根节点不是空指针,那就打印左子树的根结点的值,然后继续进入左子树的左子树,一直走到左子树为空,然后此时就遍历右子树,进而就实现了链式二叉树的先序遍历。

4.中序遍历

过程同先序遍历一样,只是打印的结点不同,这里不过多讲解。

5.后序遍历

同上。

6.求链式二叉树的结点个数

同样,这里也是用到了递归的思想,仅仅需要简单的几行代码,就实现了结点的计算。

终止条件还是root==NULL,根结点是空结点之后,说明此时就已经走到了一个结点的空指针的位置,没有必要计算的,直接返回0即可,下面的return1+是为了算上开始的结点,需要+1,然后就加上这个结点的左子树和右子树就实现了递归来求的链式二叉树的结点个数。

7.链式二叉树的叶子结点个数

叶子结点就是有一个父节点,然后他的左结点是空指针,他的又结点也是空指针,那这个结点就是叶子结点,要求的叶子结点个数也是通过递归实现的。

终止条件是有两个的一个是root==NULL,另一个就是左右结点都是空指针。

分析一下这两个终止条件,root==NULL,这个结点已经是空指针了没有加上去的意义,那肯定会有人有疑问了,根结点的左右结点是空指针了,怎么会向下递归呢,那就大错特错了,如果一个结点只有一个子结点的话,两个结点都进入,空结点返回0,非空返回1,这是其中一个终止条件的意义,另一个就很明显了,就是左右结点是空就返回1,没有什么过多需要解释的,如果这个结点不符合上述两个终止条件的话,就返回他的左子树+他的右子树。

8.求二叉树的k层的结点个数

k是层数,第一个终止条件就不用说了,重点是k==1时,返回1,k不等于1就返回左子树的k-1加上右子树的k-1,比如第二层,我们传入k=2,不会终止,然后进入左子树,左子树的k=1,右子树的k也等于1,加起来就是2.

9.链式二叉树求深度

求深度肯定不可能只求一边的深度就返回,要进行比较的,所以将左子树和右子树进行比较才能返回。

10.求值为x的结点

如果root的data等于x,就直接返回这个data的地址了,不等于的就看左子树,寻找左子树是否有等于这个值的结点,然后判断,如果不是空指针那一定是找到了,直接返回地址,右子树同理。

11.链式二叉树的销毁

需要修改指针的值,那就要取出指针的地址,下面的同样是递归,不过多讲述。

12.二叉树的层序遍历

需要进行层序遍历,这里需要借助队列来实现了,首先肯定是要创建一个队列的,然后队列进行初始化,写一个循环,只要队列不为空,就一直入队列,队列是先入先出的特点,入队列之后直接打印,然后队列删除队头,然后左子树右子树入队列接着打印,一直到队列为空,此时就实现了队列的层序遍历。

13.判断二叉树是否为完全二叉树

还需借助队列来完场,创建队列,将root入队,获取队列队头,然后队头删除,然后就一直入队,如果此时队头是空指针就直接跳出循环了,因为已经是空指针了,肯定没办法获取他的左右孩子。那么就进入下一个循环,循环条件是队列非空,因为如果是二叉树,在取完最后一个结点之后,队列中剩下的都是空结点,如果不是完全二叉树的话,里面就会剩下非空的,一直取到队列为空,如果取到了非空就直接返回false,一直走完循环结束,到最后没有找到,那就直接返回true,说明这是一个完全二叉树。

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

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

相关文章

AI是IT行业的变革力量,还是“职业终结者”?

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 AI是…

基于华为ENSP的OSPF数据报文保姆级别详解(3)

本篇博文摘要 🌟 基于华为ensp之OSPF数据报文——头部信息、Hello包、DR/BDR选举、DBD包等保姆级别具体详解步骤;精典图示举例说明、注意点及常见报错问题所对应的解决方法 引言 📘 在这个快速发展的技术时代,与时俱进是每个IT人的…

如何用SQL语句来查询表或索引的行存/列存存储方式|OceanBase 用户问题集锦

一、问题背景 自OceanBase 4.3.0版本起,支持了列存引擎,允许表和索引以行存、纯列存或行列冗余的形式创建,且这些存储方式可以自由组合。除了使用 show create table命令来查看表和索引的存储类型外,也有用户询问如何通过SQL语句…

重生之我在异世界学编程之算法与数据结构:深入堆篇

大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 正文一、堆的基本概念二、堆的存储表示三…

【网络】深入了解HTTPS协议

HTTPS协议: HTTPS 也是⼀个应用层协议 HTTPS本质上就是在HTTP的基础上加了一个加密层,抛开加密之后,剩下的内容跟HTTP一样; HTTP 协议内容都是按照文本的方式明文传输的. 这就导致在传输过程中出现一些被篡改的情况. 例如 &…

RabbitMQ基本介绍及简单上手

(一)什么是MQ MQ(message queue)本质上是队列,满足先入先出,只不过队列中存放的内容是消息而已,那什么是消息呢? 消息可以是字符串,json也可以是一些复杂对象 我们应用场…

sys.dm_exec_connections:查询与 SQL Server 实例建立的连接有关的信息以及每个连接的详细信息(客户端ip)

文章目录 引言I 基于dm_exec_connections查询客户端ip权限物理联接时间范围dm_exec_connections表see also: 监视SQL Server 内存使用量资源信号灯 DMV sys.dm_exec_query_resource_semaphores( 确定查询执行内存的等待)引言 查询历史数据库客户端ip应用场景: 安全分析缺乏…

vscode如何离线安装插件

在没有网络的时候,如果要安装插件,就会麻烦一些,需要通过离线安装的方式进行。下面记录如何在vscode离线安装插件。 一、下载离线插件 在一台能联网的电脑中,下载好离线插件,拷贝到无法联网的电脑上。等待安装。 vscode插件商店地址:https://marketplace.visualstudio.co…

基于ADAS 与关键点特征金字塔网络融合的3D LiDAR目标检测原理与算法实现

一、概述 3D LiDAR目标检测是一种在三维空间中识别和定位感兴趣目标的技术。在自动驾驶系统和先进的空间分析中,目标检测方法的不断演进至关重要。3D LiDAR目标检测作为一种变革性的技术,在环境感知方面提供了前所未有的准确性和深度信息. 在这里&…

【玩转全栈】----Django连接MySQL

阅前先赞,养好习惯! 目录 1、ORM框架介绍 选择建议 2、安装mysqlclient 3、创建数据库 4、修改settings,连接数据库 5、对数据库进行操作 创建表 删除表 添加数据 删除数据 修改(更新)数据: 获取数据 1、OR…

基于Android的疫苗预约系统

博主介绍:java高级开发,从事互联网行业多年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了多年的设计程序开发,开发过上千套设计程序,没有什么华丽的语言,只有实…

基于 Apache Commons Pool 实现的 gRPC 连接池管理类 GrpcChannelPool 性能分析与优化

基于 Apache Commons Pool 实现的 gRPC 连接池管理类 GrpcChannelPool 性能分析与优化 1. 输出关键信息的代码示例 日志记录方法 使用以下代码记录连接池的关键信息,帮助分析连接池的状态和性能瓶颈: import org.apache.commons.pool2.impl.GenericO…

矩阵碰一碰发视频的视频剪辑功能源码搭建,支持OEM

在短视频创作与传播领域,矩阵碰一碰发视频结合视频剪辑功能,为用户带来了高效且富有创意的内容产出方式。这一功能允许用户通过碰一碰 NFC 设备触发视频分享,并在分享前对视频进行个性化剪辑。以下将详细阐述该功能的源码搭建过程。 一、技术…

CClinkIEfield Basic转Modbus TCP网关模块连接三菱FX5U PLC

捷米特JM-CCLKIE-TCP是自主研发的一款CCLINK IE FB从站功能的通讯网关。该产品主要功能是将各种 MODBUS-TCP 设备接入到 CCLINK IE FB网络中。 捷米特JM-CCLKIE-TCP网关连接到CCLINK IE FB总线中做为从站使用,连接到 MODBUS-TCP 总线中做为主站或从站使用。 为了打破…

农产品智慧物流系统

本文结尾处获取源码。 本文结尾处获取源码。 本文结尾处获取源码。 一、相关技术 后端:Java、JavaWeb / Springboot。前端:Vue、HTML / CSS / Javascript 等。数据库:MySQL 二、相关软件(列出的软件其一均可运行) I…

设计模式-结构型-桥接模式

1. 什么是桥接模式? 桥接模式(Bridge Pattern) 是一种结构型设计模式,它旨在将抽象部分与实现部分分离,使它们可以独立变化。通过这种方式,系统可以在抽象和实现两方面进行扩展,而无需相互影响…

后台管理系统引导功能的实现

引导是软件中经常见到的一个功能,无论是在后台项目还是前台或者是移动端项目中。 那么对于引导页而言,它是如何实现的呢?通常情况下引导页是通过 聚焦 的方式,高亮一块视图,然后通过文字解释的形式来告知用户该功能的作…

现场展示deepseek VS openAI o1模型大对比

DeepSeek-V3 模型的发布在 AI 领域引起了广泛关注。作为一款拥有 6850 亿参数的混合专家(MoE)语言模型,DeepSeek-V3 在多个基准测试中表现出色,甚至超越了一些闭源模型。其在 Aider 代码能力排行榜上的正确率达到 48.4%&#xff0…

Golang的并发编程框架比较

# Golang的并发编程框架比较 中的并发编程 在现代软件开发中,处理高并发的能力愈发重要。Golang作为一门支持并发编程的编程语言,提供了丰富的并发编程框架和工具,使得开发者能够更轻松地处理并发任务。本文将介绍Golang中几种常用的并发编程…

SSL,TLS协议分析

写在前面 工作中总是会接触到https协议,也知道其使用了ssl,tls协议。但对其细节并不是十分的清楚。所以,就希望通过这篇文章让自己和读者朋友们都能对这方面知识有更清晰的理解。 1:tls/ssl协议的工作原理 1.1:设计的…