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

典型数据结构-栈/队列/链表、哈希查找、二叉树(BT)、线索二叉树、二叉排序树(BST树)、平衡二叉树(AVL树)、红黑树(RB树)

目录

典型数据结构列举

栈/队列/链表

二叉树

线索二叉树

二叉排序树

平衡二叉树(AVL树)

红黑树

其它树种和应用介绍


典型数据结构列举

栈/队列/链表

描述略。

一些基本的简单实现参考/数据结构简单实现/文件夹里面。

  • 线性表详解:数据结构线性表10分钟入门 (biancheng.net)。
  • 栈(Stack)和队列(Queue)详解 (biancheng.net)。

以下为树的基本概念(定义、基本操作、性质、存储结构等)、二叉树(定义、基本操作、存储、遍历等)、平衡二叉树、红黑树等。

引自:树及二叉树的基本概念_青萍之末的博客-CSDN博客。

树是由一个或一个以上的节点(node)组成,存在一个特殊节点称为树根(root),它是n(n>=0)个节点的有限集。n=0时称为空树。n>0时,有限集的元素构成一个具有层次感的数据结构。

assets/70.jpeg

树的一些概念

  • 节点的度:一个节点拥有子树的数目。例如A的度为2,B的度为1,C的度为3。
  • 树的高度:也称为树的深度,树中节点的最大层次。
  • 有序树:树中节点各子树之间的次序是重要的,不可以随意交换位置。
  • 无序树:树种节点各子树之间的次序是不重要的。可以随意交换位置。
  • 森林:0或多棵互不相交的树的集合。

引自:《数据结构教程》。

树的一些性质

  1. 非空树的节点总数等于树中所有节点的度之和加1。
  2. 度为 k 的非空树的第 i 层,最多有 k^(i-1) 个节点(i ≥ 1)。
  3. 深度为 h 的 k 叉树最多有 (k^h - 1)/(k - 1) 个节点。
  4. 具有 n 个节点的 k 叉树的最小深度为 log_k(n*(k - 1)) + 1。包含 n 个结点的二叉树的高度至少为 log_2(n) + 1。

树的基本操作

  1. 建立一棵空树 T。
  2. 求结点 x 所在树的根节点。或求树 T 的根节点。
  3. 求树 T 中结点 x 的双亲结点。
  4. 求树 T 中节点 x 的第 i 个孩子节点。
  5. 求树 T 中节点 x 右边 的兄弟节点。
  6. 把以 S 为根结点的树插入到 树 T 的 节点 x 的第 i 个子节点位置上。
  7. 删除树 T 中 节点 x 的第 i 棵树。
  8. 对一棵树进行遍历,按照某种次序遍历树所有节点并得到一个由所有节点组成的序列。

树的存储

采用链式存储方式居多。除了储存节点本身的数据信息之外,还必须做到把树中各个节点之间的连接关系反映在存储结构中。

  • 多重链表表示法:分为 定长链接数目 和 不定长链接数目。

    前者:

    1

    后者:

    2

  • 三重链表表示法:

    3

二叉树

树及二叉树的基本概念_青萍之末的博客-CSDN博客。

引自:《数据结构教程》。

二叉树结构被广泛用来解决计算机领域中的各种实际问题。例如,在排序、检索、数据库管理系统以及人工智能等许多方面,二叉树都提供了强而有效的支持。

每一个节点最多只有两颗子树。在二叉树中严格区分节点的左、右子树,其次序不能随意颠倒。因此二叉树是有序树。

二叉树又可以分为满二叉树和完全二叉树。

二叉树的基本操作

4

二叉树的存储结构

  • 顺序存储结构:顺序存储结构固有一些缺陷,使得二叉树的插入、删除等操作不方便,而且效率比较低(线性表的固有缺点)。

    5

  • 链式存储结构:更适合,更广泛。两种:二叉链表结构 和 三叉链表结构。

    二叉链表结构:链表中每一个链接点由三个域组成分,别为数据域和两个指针域,后者分别给出该节点的左、右节点的存储地址。

    6

    三叉链表结构:相比于二叉链表结构,多增加一个用来指向双亲节点的指针域,这样在查找二叉树中某个节点的双亲节点时候不用遍历整个二叉树。就是空间换时间(如查找的时间等)。

二叉树与树的遍历

有关二叉树的许多操作几乎都是建立在二叉树的遍历之上。二叉树是一种非线性结构,因此需要寻找一种规律,使得二叉树中的所有节点能够排列在一个线性序列中,这就叫遍历。

若以符号 D、L 和 R 分别表示访问根节点、遍历根结点的左子树 和 遍历根结点的右子树 三个过程,并且限定先左后右的顺序,则通常采用三种遍历方式:DLR、LDR、LRD,分别称之为 前序遍历、中序遍历、后续遍历。还有 按层次 的遍历顺序。

遍历可以用递归的方式(对于很大的树容易栈溢出)。非递归方法,通常利用一个栈结构。

下面举例按照 中序遍历 顺序遍历的程序。

7

按照层次遍历(或叫 广度优先遍历) 即 若被遍历的二叉树非空,则依次访问二叉树的第1层、第2层……直到最后一层,对每一层的访问按照从左到右的顺序进行。 该方法通常用一个队列实现。下面举例程序。

8

由遍历序列恢复二叉树

三步:

assets/9.jpg

线索二叉树

在二叉树的结点上加上线索的二叉树称为线索二叉树。对于n个结点的二叉树,在二叉链存储结构中有n+1个空链域,利用这些空链域存放在某种遍历次序下该结点的前驱结点和后继结点的指针,这些指针称为线索,加上线索的二叉树称为线索二叉树。

  • 彻底理解线索二叉树_ Walk the horizon-CSDN博客 _线索二叉树的作用。
  • 线索二叉树的理解_ huangwei18351的博客-CSDN博客 _线索二叉树。
二叉排序树

引自:《数据结构教程》。

二叉排序树用于排序、查找/检索,可以大大提高查找的时间效率(在一般情况下,查询效率比链表结构要高)。二叉排序树又叫二叉查找树。有人说,当需要完成的功能是插入、删除和检索,二叉排序树具有比迄今为止研究过的任何数据结构都有更好的性能。

引自:二叉排序树(二叉查找树)及C语言实现 (biancheng.net)。

二叉排序树要么是空二叉树,要么具有如下特点:

  • 二叉排序树中,如果其根结点有左子树,那么左子树上所有结点的值都小于根结点的值;
  • 二叉排序树中,如果其根结点有右子树,那么右子树上所有结点的值都大小根结点的值;
  • 二叉排序树的左右子树也要求都是二叉排序树;

如下图所示就是一个二叉排序树。

assets/103FJ439-0.png

引自:《数据结构教程》。

二叉排序树中插入数据,同样需要按照二叉排序树的原则进行。每次将一个新的元素插入到二叉排序树中,该元素对应的节点都是插在叶节点位置,插入的过程没有移动二叉树中其他节点。一个数据元素序列不一定按照值的大小进行排列,但当对其构造成为一棵二叉排序树以后,对该二叉排序树进行中序遍历得到的序列是一个按值大小排列的序列。

  • 二叉排序树(二叉查找树)及C语言实现 (biancheng.net)。
  • 二叉排序树_百度百科 (baidu.com)。
  • 二叉查找树(BST)及二叉树的遍历_ 青萍之末的博客-CSDN博客 _二叉搜索树的遍历。
  • 二分搜索树 | 菜鸟教程 (runoob.com)。
平衡二叉树(AVL树)

引自:平衡二叉树(AVL树)及C语言实现 (biancheng.net)。

平衡二叉树,又称为 AVL 树。实际上就是遵循以下两个特点的二叉树:

  • 每棵子树中的左子树和右子树的深度差不能超过 1;
  • 二叉树中每棵子树都要求是平衡二叉树;

其实就是在二叉树的基础上,若树中每棵子树都满足其左子树和右子树的深度差都不超过 1,则这棵二叉树就是平衡二叉树。

把二叉树中每个节点的左子树深度与右子树深度之差定义为该节点的平衡因子,因此平衡二叉树中每个节点的平衡因子只能是 1、0 或 -1。

引自:《数据结构教程》。

二叉排序树的形态,事先无法预料,随意性很大,得到的往往是一颗很不 “平衡” 的二叉树,深度差越大,其运算时间也越长,丧失了其优势。为了克服二叉排序树的这个缺陷,需要在插入和删除节点的同时对二叉树的形态结构进行必要的调整,使二叉排序树始终处于一种平衡状态。

理论上已经证明,具有 n 个节点的平衡树的深度在任何情况下都不会比具有相同节点数目的理想平衡数的深度高出 45% 以上。因此再平衡树上进行查找操作虽然比理想平衡树要慢一些,但通常比任意生成的二叉排序树中进行查找要快得多,其时间复杂度的数量级仍为O(Log_2(n))。

  • 平衡二叉树(AVL树)及C语言实现 (biancheng.net)。
  • AVL树(平衡二叉树)_ 青萍之末的博客-CSDN博客 _avl树是平衡二叉树吗。
红黑树

引自 红黑树(RB-Tree)_青萍之末的博客-CSDN博客。

红黑树是一种二叉查找树。

红黑树与AVL树的对比

  • 如果插入一个节点引起了树的不平衡,AVL和RB-Tree都是最多只需要2次旋转操作,即两者都是O(1);但是在删除节点引起树的不平衡时,最坏情况下,AVL需要维护从被删节点到根节点这条路径上所有节点的平衡性,因此需要旋转的量级O(logN),而RB-Tree最多只需3次旋转,只需要O(1)的复杂度;
  • 但是由于红黑树没有AVL树那么高度平衡,所以红黑树的查找性能相比AVL树要差一些,查找上的这一点性能差相比数据的插入和删除时的旋转性能是值得的,这就是为什么很多场合是用的红黑树,而不是AVL树,例如STL中的map和set。因此,RB-Tree在需要大量插入和删除节点的场景下效率更高。自然,由于AVL高度平衡,因此AVL的查找效率更高
  • 红黑树和AVL树的实现与比较—–算法导论 - 希隆囚徒 - 博客园 (cnblogs.com)。
  • 红黑树(RB-tree)比AVL树的优势在哪?_mmshixing的博客-CSDN博客_红黑树的优点。
  • 动画红黑树,旋转的艺术 - 知乎 (zhihu.com)。
其它树种和应用介绍
  • B树和B+树_青萍之末的博客-CSDN博客 B树是对二叉查找树的改进,B树大量应用在数据库和文件系统当中。
  • 浅谈二叉查找树、AVL树、红黑树、B树、B+树的原理及应用_青萍之末的博客-CSDN博客。
  • 还有哈夫曼树、字典树等等树种。。

相关文章:

典型数据结构-栈/队列/链表、哈希查找、二叉树(BT)、线索二叉树、二叉排序树(BST树)、平衡二叉树(AVL树)、红黑树(RB树)

目录 典型数据结构列举 栈/队列/链表 树 二叉树 线索二叉树 二叉排序树 平衡二叉树(AVL树) 红黑树 其它树种和应用介绍 典型数据结构列举 栈/队列/链表 描述略。 一些基本的简单实现参考/数据结构简单实现/文件夹里面。 线性表详解&#xff…...

pyarmor 加密许可证的使用

一 pyarmor 许可证的用处 文档:5. 许可模式和许可证 — Pyarmor 8.3.6 文档 试用版本有如下的限制: 加密功能对脚本大小有限制,不能加密超过限制的大脚本。 混淆字符串功能在试用版中无法使用。 RFT 加密模式,BCC 加密模式在试…...

网络路径监控分析

不间断的连接应该是任何企业的首要任务。然而,确保网络中的源和目标之间持续、不间断的联系一直是网络通信中一个劳动密集型的过程。了解网络路径中的障碍、识别它们并迅速解决它们以维护健康、不间断的网络至关重要。 为什么要监控网络路径 维护网络运行状况是任…...

vue双向数据绑定是如何实现的?

Vue中的双向数据绑定主要是通过数据劫持和发布订阅模式来实现的。 数据劫持: Vue通过使用Object.defineProperty()方法来对data对象中的属性进行劫持,从而实现对数据的双向绑定。具体实现方式为: (1)在Vue实例化时&a…...

el-date-picker 封装一个简单的日期组件, 主要是禁用日期

子组件 <template><div><el-date-pickerv-model"dateModel"type"datetimerange":picker-options"pickerOptions"range-separator"至"ref"picker"start-placeholder"开始日期"end-placeholder&quo…...

保研复习-计算机组成原理

计算机组成原理 计算机组成冯诺依曼体系结构计算机系统的层次结构计算机的五大组成部件编译和解释的区别 CPUCPU的组成寄存器的类型指令类型指令功能指令执行过程 存储器存储器的层次结构寻址方式 输入和输出io方式有哪几种IO接口的基本结构 计算机组成 冯诺依曼体系结构 存储…...

linux环境安装redis(亲测完成)

linux环境安装redis 亲测完成 前言一、redis简介Redis 与其他 key - value 缓存产品有以下三个特点&#xff1a;Redis 优势 二、安装redis1.下载安装包2.创建服务器安装路径3.上传安装包4.解压安装包5.依赖安装6.编译 三、启动1)默认启动错误解决方式 2)指定配置启动2.1&#x…...

关于命令行交互自动化,及pyinstaller打包wexpect的问题

Python自动化工具 用来执行命令并进行交互&#xff0c;比如需要输入账号密码或者确认的场景 linux平台可以用pexpect&#xff0c;但是windows平台有一些差异&#xff0c;比较好用的是pexpect的变种wexpect&#xff0c;如果脚本中用了wexpect&#xff0c;并且要打包成onefile&a…...

8.4 【MySQL】文件系统对数据库的影响

因为 MySQL 的数据都是存在文件系统中的&#xff0c;就不得不受到文件系统的一些制约&#xff0c;这在数据库和表的命名、表的大小和性能方面体现的比较明显&#xff0c;比如下边这些方面&#xff1a; 数据库名称和表名称不得超过文件系统所允许的最大长度。 每个数据库都对应…...

Python WEB框架FastAPI (二)

Python WEB框架FastAPI &#xff08;二&#xff09; 最近一直在使用fastapi&#xff0c;随着使用的深入发现我对于它的了解还是太少了&#xff0c;以至于踩了一些坑。所以在这里记录一下&#xff0c;愿看到的小伙伴不迷路。 路径传参并发问题 一、路径传参 这是对上一个传参…...

基于Java网络书店商城设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…...

怒刷LeetCode的第3天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一&#xff1a;动态规划 第二题 题目来源 题目内容 解决方法 方法一&#xff1a;模拟 方法二&#xff1a;数学规律 方法三&#xff1a;分组 第三题 题目来源 题目内容 解决方法 方法一&#xff1a;数学方法 方法…...

JavaScript数组去重常用方法

数组去重是在 JavaScript 开发中经常遇到的问题。本文将从前言、分析、使用场景、具体实现代码和注意事项等方面&#xff0c;详细讨论 JavaScript 数组去重的方法。 前言&#xff1a; 在 JavaScript 中&#xff0c;数组是一种常用的数据结构&#xff0c;用于存储多个值。然而…...

蓝牙电话之HFP—电话音频

1 媒体音频&#xff1a; 播放蓝牙音乐的数据&#xff0c;这种音频对质量要求高&#xff0c;数据发送有重传机制&#xff0c;从而以l2cap的数据形式走ACL链路。编码方式有&#xff1a;SBC、AAC、APTX、APTX_HD、LDAC这五种编码方式&#xff0c;最基础的编码方式是SBC&#xff0…...

JDBC基本概念

什么是JDBC JDBC概念 JDBC&#xff08;Java DataBase Connectivity&#xff09;是一套统一的基于Java语言的关系数据库编程接口规范。 该规范允许将SQL语句作为参数通过JDBC接口发送给远端数据库&#xff0c; …...

leetcode876 链表的中间节点

题目 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[3,4,5] 解释&#xff1a;链表只有一个中间结点&#xff0c;值为 3 。 输入&a…...

了解方法重写

父类 package com.mypackage.oop.demo07;//重写都是方法的重写&#xff0c;与属性无关 public class B {public static void test(){System.out.println("B>test.()");}public void test2(){System.out.println("B2>test.()");} }子类 package com…...

2、从“键鼠套装”到“全键盘游戏化”审核

1、风行内容仓的增效之路 - 前言 内容仓成立初期&#xff0c;安全审核组是规模最大的小组&#xff0c;占到部门人数的半壁江山&#xff0c;因此增效工作首先就从安全审核开始。 早期安全审核每天的达标值在800条左右&#xff0c;每天的总审核量不到1万&#xff0c;距离业务部门…...

【flutter】架构之商城main入口

架构之商城main入口 前言一、项目模块的划分二、入口main的配置三、配置文件怎么做总结 前言 本栏目我们将完成一个商城项目的架构搭建&#xff0c;并完善中间的所有功能&#xff0c;总页面大概200个&#xff0c;如果你能看完整个栏目&#xff0c;你肯定能独立完成flutter 项目…...

linux学习实操计划0103-安装软件

本系列内容全部给基于Ubuntu操作系统。 系统版本&#xff1a;#32~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Fri Aug 18 10:40:13 UTC 1 安装deb格式软件 Debian包是Unixar的标准归档&#xff0c;将包文件信息以及包内容&#xff0c;经过gzip和tar打包而成。 处理这些包的经典程序是…...

git vscode

01&#xff1a;工作区 **02&#xff1a;暂存区 git add . 3&#xff1a;本地库 git commit -m ’ 4&#xff1a;远程库 git push example 点击箭头之后...

Linux命令行批量删除文件

1、 删除当前目录下60min前的所有.log结尾文件 find ./ -type f -name "*.log" -mmin 60 -delete 2、删除当前目录下30天前的所有.log结尾文件 find ./ -type f -name "*.log" -mtime 30 -delete...

CAN - 基础

CAN 基础 概念分类特点物理层收发器线与编码方式通信方式采样点/位 常见故障 数据链路层CAN控制器数据帧分类数据帧格式数据帧DBC解析CRC校验远程帧 总线竞争与仲裁非破坏性仲裁机制 节点状态与错误处理机制节点状态错误处理机制错误帧 概念 分类 CANCAN FD高速CAN低俗容错CA…...

【Hash表】找出出现一次的数字-力扣 136

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…...

Resize和centerCrop的区别

首先要记住,transforms只能对PIL读入的图片进行操作,而且PIL和opencv只能读取H * W * C形式的图片。 resize(size)&#xff1a;将图片的短边缩放成size的比例&#xff0c;然后长边也跟着缩放&#xff0c;使得缩放后的图片相对于原图的长宽比不变。如果想要resize成自己想要的图…...

无涯教程-JavaScript - SUM函数

描述 SUM函数可添加值。 语法 SUM (number1, [number2]...)争论 Argument描述Required/Optionalnumber1The first number you want to add. The number can be a value, a cell reference, or a cell range.Requirednumber2, …You can specify up to 255 additional numbe…...

ChatGLM P-Tuningv2微调定制AI大模型

前言 什么是模型微调 想象一下,你正在学习如何弹奏一首钢琴曲目。你已经学会了一些基本的钢琴技巧,但你想要更进一步,尝试演奏一首特定的曲目。这时,你会选择一首你感兴趣的曲目,并开始深度练习。 Fine-tuning(微调)在机器学习中也是类似的概念。当我们使用预先训练好…...

关于RISC-V安全性的全面综述

目录 摘要引言RISC-V安全综述通用平台的安全要求信任的根源与硬件安全模块OTP管理模块安全内存对称加密&#xff08;如AES&#xff09;引擎不对称加密[131]&#xff08;例如&#xff0c;公钥RSA&#xff09;引擎HASH/HAMC引擎随机数/位生成&#xff08;例如TRNG[136]&#xff0…...

Python基础语法规则和Java不同的地方

Java是现在最流行的语言&#xff0c;也是广大程序员最熟悉的语言。然而&#xff0c;随着人工智能领域的快速发展&#xff0c;Python作为新星崭露头角。通过对比Java语言来学习Python语言&#xff0c;可以事半功倍。 首先&#xff0c;我们来看Python和Java在注释上的区别。在Jav…...

振弦采集仪安全监测路基边坡的解决方案

振弦采集仪安全监测路基边坡的解决方案 随着人们对交通安全的重视和公路工程的发展&#xff0c;路基边坡安全监测成为了重要的课题之一。路基边坡作为公路的基础&#xff0c;其稳定性直接关系到公路的使用寿命和行车安全。而振弦采集仪作为一种新型的安全监测设备&#xff0c;可…...

织梦是怎么做网站/新出的app推广在哪找

叶问《叶问》是知数堂新设计的互动栏目&#xff0c;不定期给大家提供技术知识小贴士&#xff0c;形式不限&#xff0c;或提问、或讨论均可&#xff0c;并在当天发布答案&#xff0c;让大家轻轻松松利用碎片时间就可以学到最实用的知识点。2018年11月6日&#xff0c;周二Show pr…...

国家 住房城乡建设信用 网站/微信营销号

ylbtech-开发框架&#xff1a;目录1.返回顶部 1、https://adminlte.io2、2.返回顶部3.返回顶部4.返回顶部5.返回顶部 6.返回顶部作者&#xff1a;ylbtech出处&#xff1a;http://ylbtech.cnblogs.com/本文版权归作者和博客园共有&#xff0c;欢迎转载&#xff0c;但未经作者同意…...

网站开发设计思想报告/站长工具精品

SELECT DISTINCT 语句用于返回唯一不同的值。 SQL SELECT DISTINCT 语句 在表中&#xff0c;一个列可能会包含多个重复值&#xff0c;有时您也许希望仅仅列出不同&#xff08;distinct&#xff09;的值。 DISTINCT 关键词用于返回唯一不同的值。 SQL SELECT DISTINCT 语法 …...

注册网站域名用什么好处/手机网站建设价格

如何减少运维团队的日常琐事&#xff1f;如何将服务平台化&#xff0c;赋予用户自我服务的能力&#xff1f;新东方云利用Rancher容器管理平台、Harbor镜像仓库和GitLab构建企业应用商店。赋能运维团队和用户&#xff0c;尝试破解用户自服务的难题。开场先讲个小故事&#xff1a…...

泉州模板做网站/教育培训机构排名

面试跳槽 说到面试跳槽&#xff0c;大家从当初入行开始就一直摆脱不开它&#xff08;咱们就是通过不断跳槽才能更快地提升自己&#xff09;。在我们的技术生涯中会有很多大大小小的面试&#xff0c;对我们程序员来说每一次面试都是一次提升的机会&#xff0c;不管是简历修改&a…...

芜湖哪里有做网站的/网页推广方案

2019独角兽企业重金招聘Python工程师标准>>> 时间轴组合-Timeline Portfolio 转载于:https://my.oschina.net/GaoLNMP/blog/207530...