数据结构篇——二叉树的存储与遍历

news2025/3/18 18:19:52

     一、引入   


        书接上文,文于此续。上文我们学到了树的存储结构,那么今天,我们来学习下几种特殊的二叉树以及关于它的各种遍历,让我们一起加油吧。

二、特殊的二叉树


        二叉树的特殊形式这里介绍3种,其中需要着重记忆的有满二叉树完全二叉树。其余1种大家了解认识即可。

1、斜树:

        就跟他的名字一样,所有结点只有左子树的叫做左斜树,只有右子树的叫做右斜树。具体图示如下:

2、满二叉树:

        满二叉树其实就是每个结点(除开叶子结点)的左右子树都齐全的树即深度为k且含有2^{k-1}个结点的二叉树,如图所示:

        满二叉树的特点主要是:每一层上的结点树都是最大结点树,即每一层i的结点树都有最大值2^{i-1}。 可以对满二叉树按层序编号:约定编号从根结点(根结点编号为1)起,自上而下,自左向右。由此就能引出完全二叉树的定义。

3、完全二叉树:

        深度为k、有n 个结点的二叉树,当且仅当其每个结点都与深度为k的满二叉树中编号为1~n的结点一一对应时,称为完全二叉树,如下图所示:

        完全二叉树的特点是:

  1. 叶子结点只可能在层次最大的两层上出现。
  2. 对于任意结点,若其右分支下的子孙的最大层次为l,则其左分支下子孙最大层次一定是l或l+1层。

这里提出两个关于完全二叉树的性质:

  1. 具有n个结点的完全二叉树的深度为不大于\log_{2}n+1的最大整数。
  2. 如果对一颗有n个结点的完全二叉树(其深度为不大于\log_{2}n+1的最大整数)的结点按层序编号,则对任意结点i有:
         (1)如果i=1,则结点i是二叉树的根,无双亲;如果i>1,则其双亲PARENT (i)是结点[i/2]。
         (2)如果2i>n,则结点i无左孩子(结点i为叶子结点);否则其左孩子LCHILD(t)是结点2i。
         (3)如果2i+1>n,则结点i无右孩子;否则其右孩子RCHILD(i)是结点2i+1。

三、二叉树的存储结构 


        二叉树的存储结构和线性表类似,主要采用顺序和链式两种存储结构。

 1、顺序存储结构:

        顺序结构通常是采用一组连续的地址来存储数据,术语为了能够顺利的存储二叉树中的数据,就必须按照一定的规律来顺序来排放。

        对于完全二叉树来说,只要从根起按层序存储即可,依次从上至下,从左往右来存储树中的结点并编号。这样,编号为i的结点元素就会存储在一维数组中下标为i-1的分量当中。

        而对于一般二叉树来说,也按照完全二叉树那般排列,只是在一般二叉树中没有的部分就用“0”来表示,具体的图示如下:        从图中我们不难发现,这种顺序存储的结构只适用于完全二叉树,对于一般的二叉树来说就会造成大量的空间浪费。所以对于一般的二叉树来说更适合链式存储法。

2、链式存储法:

        同线性表的链式存储一般,想要实现一个链表就得确定其每一个结点的结构。对于二叉树来说,如下图所示的(a)它的结构主要分为数据域(data)、两个指向左右子树的指针域和一个指向双亲的指针域。通过这样分析我们就能确定其结构。那让我们仔细想想,指向双亲的指针域好像不是必要的。所以,我们就能发现,带有双亲指针域的存储结构多为三叉链表、反之则为二叉链表分别如下图中的(c)、(b)所示:

        关于二叉树的链式存储结构,可以参考下图理解:

         结合树的存储结构我们就能用代码表示出如下结构:

typedef struct BiTNode{
    TElemType data;    //结点数据域
    struct BiTNode *lchild,*rchild;    //左右子树指针域
}BiTNode,*BiTree;

四、二叉树的遍历 


        遍历二叉树是指从根结点开始,按照某条搜索路径了解寻访树中的每一个结点,使得树中的每一个结点都被访问一次且只被访问一次。其中主要的方法有先序遍历、中序遍历、后序遍历及其各种演化。

1、先序遍历:

        顾名思义,用自然语言表达则是:先访问根节点A,再按此规则递归遍历左子树(B - D - G - H),最后递归遍历右子树(C - E - I - F ),序列为A B D G H C E I F 。具体实现如下图所示:

具体的算法步骤如下:

  1. 访问根结点;
  2. 先序遍历左子树;
  3. 先序遍历右子树。

代码描述:

void PreOrder(BiTree T){
	if(T != NULL){
		visit(T);	//访问根节点
		PreOrder(T->lchild);	//递归遍历左子树
		PreOrder(T->rchild);	//递归遍历右子树
	}
}

2、中序遍历:

        自然语言描述:先左子树(G - D - H ),再根节点(A ),后右子树(I - E - C - F ),序列为G D H B A I E C F 。具体实现如下图所示:

算法步骤:

  1. 中序遍历左子树;
  2. 访问根结点;
  3. 中序遍历右子树。 

代码描述:

void InOrder(BiTree T){
	if(T != NULL){
		InOrder(T->lchild);	//递归遍历左子树
		visit(T);	//访问根结点
		InOrder(T->rchild);	//递归遍历右子树
	}
}

 3、后序遍历:

        自然语言描述:先左子树(G - H - D ),再右子树(I - F - E ),最后根节点A,序列为G H D B I F E C A 。具体实现如下图所示:

算法步骤:

  1. 后序遍历左子树;
  2. 后序遍历右子树;
  3. 访问根结点。 

代码描述:

void PostOrder(BiTree T){
	if(T != NULL){
		PostOrder(T->lchild);	//递归遍历左子树
		PostOrder(T->rchild);	//递归遍历右子树
		visit(T);	//访问根结点
	}
}

 以上就是二叉树最基础的三种遍历方法了。先偷偷懒,咱下期再见。

        

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

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

相关文章

分而治之:用于 RGB-T 显著目标检测的 Confluent Triple-Flow 网络(问题)

摘要 问题一:RGB-thermal显著对象检测这是什么? RGB图像是可见光的三通道图像,而thermal是热红外图像,通常为单通道,记录物体的热辐射信息。结合RGB和thermal两种模态的数据,可以利用两者的互补信息&…

求职招聘网站源码,找工作招工系统,支持H5和各种小程序

招聘找活招工平台系统源码 招聘求职找工作软件 发布信息积分充值招聘系统,里面带纤细教程 功能介绍: 招工小程序主要针对工地招工工人找工作,工地可以发布招工信息,工人可以发布找活信息,招工信息可以置顶,置顶需要积分,积分可以通过签到、分享邀请好友、充值获取,后…

企业微信群聊机器人开发

拿到机器人hook 机器人开发文档 https://developer.work.weixin.qq.com/document/path/91770

基于Python的tkinter开发的一个工具,解析图片文件名并将数据自动化导出为Excel文件

文章目录 一、开发背景与业务价值二、系统架构设计1. 分层架构图解2. 核心类结构3. 文件解析流程 三、关键技术实现详解1. 高性能文件名解析引擎2. 可视化数据展示3. 智能Excel导出模块 四、完整代码五、行业应用展望 一、开发背景与业务价值 在零售行业会员管理场景中&#x…

Flutter_学习记录_状态管理之GetX

1. 状态管理、Flutter Getx介绍 1.1 状态管理 通俗的讲:当我们想在多个页面(组件/Widget)之间共享状态(数据),或者一个页面(组件/Widget)中的多个子组件之间共享状态(数…

【网络】数据流(Data Workflow)Routes(路由)、Controllers(控制器)、Models(模型) 和 Middleware(中间件)

在图片中,数据流(Data Workflow)描述了应用程序中数据的流动过程,涉及 Routes(路由)、Controllers(控制器)、Models(模型) 和 Middleware(中间件&…

Git下载安装(保姆教程)

目录 1、Git下载 2、Git安装(windows版) (1)启动安装程序 (2)阅读许可协议 (3)选择安装路径 (4)选择组件 (5)选择开始菜单文件夹…

Blender-MCP服务源码2-依赖分析

Blender-MCP服务源码2-依赖分析 有个大佬做了一个Blender-MCP源码,第一次提交代码是【2025年3月7号】今天是【2025年月15日】也就是刚过去一周的时间,所以想从0开始学习这个代码,了解一下大佬们的开发思路 1-核心知识点 from mcp.server.fas…

LabVIEW压比调节器动态试验台

本案介绍了一种基于LabVIEW的压比调节器动态试验台的设计,通过实用的LabVIEW图形化编程语言,优化了数据采集与处理的整个流程。案例通过实际应用展示了设计的专业性与高效性,以及如何通过系统化的方法实现精确的动态测试和结果分析。 ​ 项目…

2025-03-17 Unity 网络基础1——网络基本概念

文章目录 1 网络1.1 局域网1.2 以太网1.3 城域网1.4 广域网1.5 互联网(因特网)1.6 万维网1.7 小结 2 IP 地址2.1 IP 地址2.2 端口号2.3 Mac 地址2.4 小结 3 客户端与服务端3.1 客户端3.2 服务端3.3 网络游戏中的客户端与服务端 1 网络 ​ 在没有网络之前…

springboot441-基于SpringBoot的校园自助交易系统(源码+数据库+纯前后端分离+部署讲解等)

💕💕作者: 爱笑学姐 💕💕个人简介:十年Java,Python美女程序员一枚,精通计算机专业前后端各类框架。 💕💕各类成品Java毕设 。javaweb,ssm&#xf…

浅谈数据分析及数据思维

目录 一、数据分析及数据分析思维?1.1 数据分析的本质1.2 数据分析思维的本质1.2.1 拥有数据思维的具体表现1.2.2 如何培养自己的数据思维1.2.2.1 书籍1.2.2.2 借助工具1.2.2.3 刻意练习 二、数据分析的价值及必备能力?2.1 数据分析的价值2.1.1 现状分析…

自定义uniapp组件,以picker组件为例

编写目的 本文说明基于vue3定义uniapp组件的关键点: 1、一般定义在components文件夹创建组件,组件与页面已经没有明确的语法格式区别,所以可以与页面的语法保持一致 ; 2、组件定义后使用该组件的页面不需要引用组件即可使用&am…

【操作系统安全】任务4:Windows 系统网络安全实践里常用 DOS 命令

目录 一、引言 二、网络信息收集类命令 2.1 ipconfig 命令 2.1.1 功能概述 2.1.2 实例与代码 2.2 ping 命令 2.2.1 功能概述 2.2.2 实例与代码 2.3 tracert 命令 2.3.1 功能概述 2.3.2 实例与代码 三、网络连接与端口管理类命令 3.1 netstat 命令 3.1.1 功能概述…

【从零开始学习计算机科学】信息安全(二)物理安全

【从零开始学习计算机科学】信息安全(二)物理安全 物理安全物理安全的涵义物理安全威胁常见物理安全问题物理安全需求规划物理安全需求设备安全防盗和防毁机房门禁系统机房入侵检测和报警系统防电磁泄漏防窃听设备管理设备维护设备的处置和重复利用设备的转移电源安全电源调整…

LeetCode hot 100—验证二叉搜索树

题目 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 示例 示例 1&#…

MongoDB 可观测性最佳实践

MongoDB 介绍 MongoDB 是一个高性能、开源的 NoSQL 数据库,它采用灵活的文档数据模型,非常适合处理大规模的分布式数据。MongoDB 的文档存储方式使得数据结构可以随需求变化而变化,提供了极高的灵活性。它支持丰富的查询语言,允许…

论文阅读笔记——LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS

LoRA 论文 传统全面微调&#xff0c;对每个任务学习的参数与原始模型相同&#xff1a; m a x Φ ∑ ( x , y ) ∈ Z ∑ t 1 ∣ y ∣ l o g ( P Φ ( y t ∣ x , y < t ) ) 式(1) max_{\Phi}\sum_{(x,y)\in Z}\sum^{|y|}_{t1}log(P_{\Phi}(y_t|x,y<t)) \qquad \text{式(…

UE5中 Character、PlayerController、PlayerState、GameMode和GameState核心类之间的联动和分工·

1. GameMode 与 GameState 关系描述 GameMode&#xff1a;定义游戏规则和逻辑&#xff0c;控制游戏的开始、进行和结束。GameState&#xff1a;存储和同步全局游戏状态&#xff0c;如得分、时间、胜利条件等。 联动方式 GameMode初始化GameState&#xff1a;GameMode在游戏…

Ubuntu24.04 启动后突然进入tty,无法进入图形界面

问题描述 昨晚在编译 Android AOSP 14 后&#xff0c;进入了登录页面&#xff0c;但出现了无法输入密码的情况&#xff0c;且无法正常关机&#xff0c;只能强制重启。重启后&#xff0c;系统只能进入 TTY 页面&#xff0c;无法进入图形界面。 问题排查 经过初步排查&#x…