当前位置: 首页 > article >正文

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

     一、引入   


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

二、特殊的二叉树


        二叉树的特殊形式这里介绍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);	//访问根结点}
}

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

        

相关文章:

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

一、引入 书接上文,文于此续。上文我们学到了树的存储结构,那么今天,我们来学习下几种特殊的二叉树以及关于它的各种遍历,让我们一起加油吧。 二、特殊的二叉树 二叉树的特殊形式这里介绍3种,其中需要着重记忆的有…...

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

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

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

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

18.使用读写包操作Excel文件:xlrd、xlwt 和 xlutils 包

一 xlrd、xlwt 和 xlutils 包的介绍 OpenPyXL 和 xlrd、xlwt 、xlutils 的区别在笔记 15 。 二 如何使用 xlrd 读取文件 1.获取所有工作表的名称 book.sheet_names():得到一个列表。 import xlrd import xlwt from xlwt.Utils import cell_to_rowcol2 import xluti…...

python脚本实现服务器内存和cpu使用监控,并记录日志,可以设置阈值和采样频率

Python 脚本,实现以下功能: 按日期自动生成日志文件(例如 cpu_mem_20231001.csv)当 CPU 或内存超过阈值时触发记录独立记录报警事件(保存到 alert.log)支持自定义阈值和监控间隔 脚本代码 import psutil …...

企业微信群聊机器人开发

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

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

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

c++面向对象笔记

本文章总结了所有面向对象可能会用到的笔记以及知识,同时也是cGESP6级的必考题,不推荐0基础阅读,请见谅! 一.面向对象三大特性 C面向对象的三大特性:封装、继承、多态 1.封装 1.1封装的意义 封装的意义如下&#…...

pyqt 上传文件或者文件夹打包压缩文件并添加密码并将密码和目标文件信息保存在json文件

一、完整代码实现 import sys import os import json import pyzipper from datetime import datetime from PyQt5.QtWidgets import (QApplication, QWidget, QVBoxLayout, QHBoxLayout,QPushButton, QLineEdit, QLabel, QFileDialog,QMessageBox, QProgressBar) from PyQt5.…...

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

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

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

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

c++ 中的可变参数模板与折叠表达式

c 11 引入了可变参数模板,c 17 引入了折叠表达式,比 c 语言的可变参数更加简洁灵活。这篇博客总结了一些例子。 …(省略号)用于可变参数(Variadic Arguments),它可以放在模板参数 或 函数参数的…...

Vala教程-第一个程序(Hello world)

代码 class Demo.HelloWorld : GLib.Object {public static int main(string[] args) {stdout.printf("Hello, World\n");return 0;} } 解析 这是一个 Vala Hello World 程序。我将一步一步地介绍它。 class Demo.HelloWorld : GLib.Object { 这一行定义了一个He…...

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图形化编程语言,优化了数据采集与处理的整个流程。案例通过实际应用展示了设计的专业性与高效性,以及如何通过系统化的方法实现精确的动态测试和结果分析。 ​ 项目…...

基于“动手学强化学习”的知识点(二):第 15 章 模仿学习(gym版本 >= 0.26)

第 15 章 模仿学习(gym版本 > 0.26) 摘要 摘要 本系列知识点讲解基于动手学强化学习中的内容进行详细的疑难点分析!具体内容请阅读动手学强化学习! 对应动手学强化学习——模仿学习 # -*- coding: utf-8 -*-import gy…...

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 现状分析…...

Hexo主题配置and常用指令

Hexo 主题配置步骤 安装Hexo&#xff1a; 安装Node.js和Git。使用npm安装Hexo CLI&#xff1a;npm install -g hexo-cli。 创建新的Hexo项目&#xff1a; 执行命令&#xff1a;hexo init <folder>&#xff0c;其中<folder>是你的项目目录名。进入项目文件夹&#…...

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

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

测试工程师指南:基于需求文档构建本地安全知识库的完整实战

需求文档是测试工程师日常工作的核心工具&#xff0c;如何快速检索需求文档中的关键信息&#xff08;文本、表格、图片等&#xff09;&#xff0c;并将其转化为可供 AI 查询的知识库&#xff0c;是提升工作效率的重要手段。本文将通过对 需求文档&#xff08;docx 格式&#xf…...

IP关联的定义和避免方法

大家好&#xff01;今天我们来聊一聊一个在运营多个网络账号时会遇到的重要问题——IP关联。对于那些正在运营多个账号或者进行多窗口任务的朋友们&#xff0c;这无疑是一个你必须关注的问题。IP关联&#xff0c;简单来说&#xff0c;就是多个账号在使用相同IP地址的情况下进行…...

浅述WinForm 和 WPF 的前景

在.NET 开发领域&#xff0c;WinForm 和 WPF 都是用于创建桌面应用程序的技术框架&#xff0c;但它们在很多方面存在差异&#xff0c;对于开发者来说&#xff0c;也常常会思考哪个更有前途。 一、WinForm 1. 成熟/稳定度&#xff1a; WinForms 是较早的桌面应用程序框架&am…...

CSS3学习教程,从入门到精通,CSS3 属性语法知识点及案例代码(4)

CSS3 属性语法知识点及案例代码 一、CSS3 文本属性 1. 颜色相关属性 color&#xff1a;设置文本颜色。text-shadow&#xff1a;设置文本阴影。 2. 字体相关属性 font-family&#xff1a;设置字体系列。font-size&#xff1a;设置字体大小。font-weight&#xff1a;设置字体…...

MyBatis SqlSession 是如何创建的? 它与 SqlSessionFactory 有什么关系?

SqlSession 是 MyBatis 中与数据库交互的核心接口&#xff0c;它提供了执行 SQL 语句、管理事务、获取 Mapper 接口代理对象等关键功能。 SqlSession 实例 不是直接通过 new 关键字创建的&#xff0c;而是通过 SqlSessionFactory 工厂来创建的。 SqlSessionFactory 负责创建 Sq…...

【操作系统安全】任务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 功能概述…...

Vue 概念、历史、发展和Vue简介

一、Vue概念 官方定义&#xff1a; 渐进式JavaScript 框架&#xff0c;易学易用&#xff0c;性能出色&#xff0c;适用场景丰富的 Web 前端框架。 Vue.js 是一个流行的前端JavaScript框架&#xff0c;由尤雨溪&#xff08;Evan You&#xff09;开发并维护。 它最初于2014年发…...

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

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