数据结构有哪些

2023-11-09

概念:

数据结构 : 数据用什么样的方式组合在一起。
数据结构是计算机存储数据的方式,指相互之间存在一种或多种特定关系的数据元素集合

常见数据结构:

数据存储的常用结构有:栈、队列、数组、链表和红黑树

栈:

stack,又称堆栈,它是运算受限的线性表,其限制是仅允许在标的一端进行插入和删除操作,不允许在其
他任何位置进行添加、查找、删除等操作。

栈结构的特点:

先进后出(FILO)

  • 压栈(进栈):就是存元素。即,把元素存储到栈的顶端位置,栈中已有元素依次向栈底方向移动一个位置。
  • 弹栈(出栈):就是取元素。即,把栈的顶端位置元素取出,栈中已有元素依次向栈顶方向移动一个位置。

图解:
在这里插入图片描述

队列结构:

queue,简称队,它同堆栈一样,也是一种运算受限的线性表,其限制是仅允许在表的一端进行插入,而在表的另一端进行删除。

队列结构的特点:

先进先出(FIFO),进和出是两个口,比如我们排队是不是先排的先拿到号离开

在这里插入图片描述

数组结构:

数组是一种查询快,增删慢的模型
在内存中,数组的数据连续存放,数据长度固定,这样知道数组开头位置和偏移量就可以直接计算出数据地址
查询数据通过地址值和索引定位,查询任意数据耗时相同,查询速度快
删除数据时,要将原始数据删除,同时后面每个数据前移,删除速度慢
添加数据时,添加位置的每个数据后移,再添加元素,添加速度慢

数组结构的特点:
在这里插入图片描述

链表结构:

链表:linked list,由一系列结点node(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。我们常说的链表,结构有单向链表与双向链表。

  • 简单的说,采用该结构的集合,对元素的存取有如下的特点:
  • 查找元素慢:想查找某个元素,需要通过连接的节点,依次向后查找指定元素
  • 增删元素快:添加或者删除某个元素,只要更换上一个节点和下一个节点就可以了

单向链表:
在这里插入图片描述

双向链表:

单向链表如果说是只能向右看,那么双向链表就是可以左右看了,它是前面记录上一个的地址,后面是下一个的地址。 一般用双向链表比较多,因为比较方便

在这里插入图片描述

总结:

链表元素不是连续存放的,上一个元素记录下一个元素的地址,查慢、增删快

二叉树:
  • 二叉树是高度平衡的数据结构,误差超过1就会旋转
  • 树的作用可以做排序可以做索引,比较方便,查找的时候呢可以说是(二分搜索)就是你每次找判断都砍掉一半无用的树
  • 每个节点不超过2,左子树元素小,右子树元素大
  • 节点: 在树结构中,每一个元素称之为节点
  • 度: 每一个节点的子节点数量称之为度

二叉树结构图:
在这里插入图片描述

二叉查找树:

请添加图片描述
二叉树和二叉查找树对比:

二叉树没有规律,而二叉查找树有规律,任意的一个结点都是左小右大

请添加图片描述
二叉查找树添加原理:

  • 先和根节点比较,再和子节点比较,小存左、大存右、相同不存
  • 拿数据7、4、10三个数据举栗
  • 先存7作为根节点,再存4,存4的时候要判断4是大于7还是小于7,小于就做位7的左子节点,大于就做位7的右子节点。10也是一样。然后就是7为根节点,4为左子节点,10位右子节点。

二叉查找树的弊端:

  • 拿数据7、10、11、12举栗
  • 先存7作为根节点
  • 再存10,存10的时候要判断4是大于7还是小于7,然后就成为了7的右子节点。
  • 再存11,12,最后发现,整棵树都是右子节点,没有左子节点。
  • 那么查找的时候就要一个一个的去遍历,效率低,因为左子节点和右子节点高度差太大。
平衡树二叉树:
  • 二叉树左右两个子树的高度差不超过1
  • 任意节点的左右两个子树都是一颗平衡二叉树
  • 平衡二叉树存在的意义就是解决二叉树高度不一致的问题

旋转树:

  • 旋转树就是平衡机制,存在就是保证二叉树的平衡
  • 旋转触发时机: 只有平衡二叉树和红黑树会用到,当添加节点破坏了平衡就会触发左右旋转

左旋:

逆时针左旋转,整体往左旋转,右子节点变父节点,原来的根节点降级成左子节点,多余的左子节点给降级的左子节点当右子节点

请添加图片描述

右旋:

顺时针右旋转,整体往右旋转,左子节点变父节点,原来的根节点降级成右子节点,多余的右子节点给降级的右子节点当左子节点

请添加图片描述

平衡二叉树旋转的四种情况:

左左:

  • 当根节点左子树的左子树有节点插入,导致二叉树不平衡
  • 如何旋转: 直接对整体进行右旋即可
  • 4会做为根节点,2为左子节点,7为右子节点,5为7的左子节点

请添加图片描述

左右:

  • 当根节点左子树的右子树有节点插入,导致二叉树不平衡
  • 如何旋转: 先在左子树对应的节点位置进行左旋,在对整体进行右旋
  • 先把圈起来的部分左旋,然后如图二再右旋

在这里插入图片描述

请添加图片描述

右右:

  • 当根节点右子树的右子树有节点插入,导致二叉树不平衡
  • 如何旋转: 直接对整体进行左旋即可
  • 将10做为根节点,7成为10的左子,11为右子,9为7的右子节点

请添加图片描述

右左:

  • 当根节点右子树的左子树有节点插入,导致二叉树不平衡
  • 如何旋转: 先在右子树对应的节点位置进行右旋,在对整体进行左旋
  • 先把10节点下的右旋,然后如右图所示再整体左旋

请添加图片描述
在这里插入图片描述

红黑树:
  • 红黑树(平衡二叉B树)
  • 每一个节点可以是红或者黑
  • 红黑树不是高度平衡的,它的平衡是通过自己的"红黑规则"进行实现的

红黑规则:

  1. 每一个节点或是红色的,或者是黑色的
  2. 根节点必须是黑色
  3. 如果一个节点没有子节点或者父节点,则该节点相应的指针属性值为Nil,这些Nil视为叶节点,每个叶节点(Nil)是黑色的
  4. 如果某一个节点是红色,那么它的子节点必须是黑色(不能出现两个红色节点相连 的情况)
  5. 对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点

添加节点规则:

  1. 添加节点的时候默认为红色效率高(对应红黑规则跳转比较少)
  2. 红黑树添加节点后如何保持红黑规则
    如果是根节点位置,直接变为黑色
    非根节点位置,父节点为黑色,不需要任何操作,默认红色即可
  3. 父节点为红色叔叔节点为红色
    将”父节点”设为黑色,将”叔叔节点”设为黑色
    将”祖父节点”设为红色
    如果”祖父节点”为根节点,则将根节点再次变成黑色
  4. 叔叔节点为黑色
    将”父节点”设为黑色
    将”祖父节点”设为红色
    以”祖父节点”为支点进行旋转

在这里插入图片描述

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构有哪些 的相关文章

  • leetcode算法面试题:对称二叉树、对链表进行插入排序、多数元素

    对称二叉树问题 给定一个二叉树 检查它是否是镜像对称的 例如 二叉树 1 2 2 3 4 4 3 是对称的 1 2 2 3 4 4 3 但是下面这个 1 2 2 null 3 null 3 则不是镜像对称的 1 2 2 3 3 参考答案 c
  • C++中ListNode线性链表的定义及其使用方法(Leedcode两数相加题目)

    1 ListNode线性链表定义 struct ListNode int val ListNode next ListNode val 0 next NULL ListNode int x val x next NULL ListNode
  • 搞懂后序遍历!只需要这一篇

    讲讲对于后序遍历的理解 并通过题目加深理解 文章目录 核心 基础实现方式 104 二叉树的最大深度 111 二叉树的最小深度 222 完全二叉树的节点个数 110 平衡二叉树 101 对称二叉树 总结 核心 后序遍历的顺序为左右中 在一棵二
  • 华为OD机试真题-座位调整-2023年OD统一考试(B卷)

    题目描述 疫情期间课堂的座位进行了特殊的调整 不能出现两个同学紧挨着 必须隔至少一个空位 给你一个整数数组 desk表示当前座位的占座情况 由若干 0 和 1 组成 其中 0 表示没有占位 1 表示占位 在不改变原有座位秩序情况下 还能安排
  • 剑指Offer - 面试题25:合并俩个排序的链表

    题目 输入俩个递增排序的链表 合并这俩个链表并使新链表中的节点仍然是递增序列 例如下图链表1和链表2 合并后的升序链表为链表3 链表节点定义如下 typedef int TElemType 链表节点值的数据类型 struct ListNod
  • 2-数据结构-线性表之顺序表的动态分配

    说明 由于原来顺序表的静态分配 浪费空间 且存在溢出现象 因此采取动态分配的方式 创建顺序表中的数组 跟C语言正常动态分配一样 需要直到扩充的大小 和数组指针即可 代码如下 看着多 其实原理差不多 主要知道哪些操作即可 无需了解具体代码 i
  • leetcode-合并两个有序链表(详解)

    合并两个有序链表 前言 一 题链接 题意 题思路 题思路图解 题代码 总结 前言 路漫漫及修远兮 一 题链接 题意 将两个升序链表合并为一个新的 升序 链表并返回 新链表是通过拼接给定的两个链表的所有节点组成的 输入 l1 1 2 4 l2
  • 模拟实现 队列 - JAVA(使用链表,数组)

    以链表实现 以数组实现 以链表实现 class Node public int val public Node next public Node int val this val val public class MyQueue publi
  • java实现简单的生成52张牌、三个人洗牌、码牌算法

    定义一个Pocker类 用于定义牌类 package demo public class Poker private String suit 花色 private int rank 数字 构造函数 public Poker String s
  • 二叉树的各种操作函数

    include source h 满与空的问题 计算个数时 判断rear和front的大小1 2 空一个 void InitQueue Queue u u front 0 u rear 0 int sizeQue Queue u int s
  • LeetCode题目笔记——24. 两两交换链表中的节点

    文章目录 题目描述 题目链接 题目难度 中等 方法一 迭代 代码 C 代码 python 方法二 递归 代码 C 总结 题目描述 或许这也是个经典的面试题 记录一手 给你一个链表 两两交换其中相邻的节点 并返回交换后链表的头节点 你必须在不
  • 【C++】STL中list容器内部元素的移动和交换

    文章目录 前言 一 list是什么 二 元素移动 1 插入 删除 2 切除 拼接 三 元素交换 1 元素值交换 2 元素 节点 交换 总结 前言 提示 list insert list erase list splice std iter
  • 带头双向循环链表:一种高效的数据结构

    博客主页 江池俊的博客 收录专栏 数据结构探索 专栏推荐 cpolar C语言进阶之路 代码仓库 江池俊的代码仓库 编译环境 Visual Studio 2022 欢迎大家点赞 评论 收藏 文章目录 一 带头循环双向链表的概念及结构 二 使
  • 算法题-简单系列-01-链表反转

    文章目录 1 题目 1 1 使用栈解决 1 2 反转链表 1 题目 给定一个单链表的头结点pHead 该头节点是有值的 比如在下图 它的val是1 长度为n 反转该链表后 返回新链表的表头 如当输入链表 1 2 3 时 经反转后 原链表变为
  • 二叉树(接口函数的实现)

    今天继续来分享的是二叉树 我们废话不多说 直接来看下面的几个接口函数 然后我们把他们实现 我们就掌握二叉树的二分之一 今天粉丝破千了 属实有点高兴了 typedef char BTDataType typedef struct Binary
  • 华为OD机试 Python 【最大载货量】

    描述 在火车站旁的货运站 小明负责调度2K辆中转车 其中K辆用于干货 K辆用于湿货 每批到站的货物来自不同的供货商 需要按照顺序装入中转车 注意 一个供货商的货物只能装在一辆车上 不能分开 但是 一辆车可以放多个供货商的货物 问题是 要让所
  • LeetCode21. Merge Two Sorted Lists

    文章目录 一 题目 二 题解 一 题目 You are given the heads of two sorted linked lists list1 and list2 Merge the two lists into one sort
  • 206.翻转链表

    翻转链表 力扣 LeetCode 官网 全球极客挚爱的技术成长平台 备战技术面试 力扣提供海量技术面试资源 帮助你高效提升编程技能 轻松拿下世界 IT 名企 Dream Offer https leetcode cn problems re
  • 链表的中间节点

    链表的中间节点 力扣 LeetCode 官网 全球极客挚爱的技术成长平台 备战技术面试 力扣提供海量技术面试资源 帮助你高效提升编程技能 轻松拿下世界 IT 名企 Dream Offer https leetcode cn problems
  • 「优选算法刷题」:移动零

    嗨 这个假期罗根开始接触了算法 在为今年的蓝桥杯做准备 所以 开个新专栏 记录记录自己做算法题时的心得 一 题目 给定一个数组 nums 编写一个函数将所有 0 移动到数组的末尾 同时保持非零元素的相对顺序 请注意 必须在不复制数组的情况下

随机推荐

  • 开源|携程机票 App KMM 跨端 KV 存储库 MMKV-Kotlin

    作者简介 禹昂 携程移动端资深工程师 专注于 Kotlin 移动端跨平台领域 Kotlin 中文社区核心成员 图书 Kotlin 编程实践 译者 一 背景 携程机票移动端研发团队自 2021 年始就一直在移动端实践 Kotlin Multi
  • 关于二进制的练习

    前言 一 二题为牛客网练习 都有题目链接 文章目录 一 两个整数二进制位不同个数 二 输入一个整数 n 输出该数32位二进制表示中1的个数 其中负数用补码表示 三 获取一个整数二进制序列中所有的偶数位和奇数位 分别打印出二进制序列 一 两个
  • 马尔可夫过程

    马尔可夫过程的定义 平稳过程的平稳性保证了未来可以通过过去来预知 而马尔科夫是这样的一类过程 即未来只与现在有关 与过去无关 就是你的过去是什么样子不重要 未来只与自己当下的努力有关 我们只需要知道当前的信息就够了 举一个实际例子比如说卖电
  • 静态路由协议的默认管理距离是_距离矢量路由选择协议

    上一节我们主要讲述了影响路由选择协议的四个因素 路径决策 度量 收敛 负载均衡 也提了一下大多数路由选择协议的分类有距离矢量和链路状态 本节我们主要讲述一下距离矢量路由选择协议 首先说一下 该路由选择协议的由来 由于该路由选择协议通告的方式
  • https网络编程——如何做web的访问控制机制(ACL)

    参考 如何做web的访问控制机制 ACL 地址 https qingmu blog csdn net article details 108286660 spm 1001 2014 3001 5502 目录 ACL含义 例子 具体实现 AC
  • Linux相关的小知识点

    Linux 中每个 TCP 连接最少占用多少内存 详细解释 Linux 内核到底长啥样详细解释
  • GPS模块启动模式

    文章目录 GPS启动模式 1 冷启动 2 热启动 3 温启动 GPS模块举例 GPS启动模式 有3种启动模式 冷启动 温启动 热启动 启动时间 冷启动 gt 温启动 gt 热启动 启动时间越长定位越慢 用户使用体验越差 1 冷启动 冷启动是
  • Segmentation简记1-The Liver Tumor Segmentation Benchmark (LiTS)

    创新点 最主要的创新是建立了一个肝脏CT图像分割数据库 总结 类似于综述加上数据库的介绍 没有细看 医学方面时候会用到
  • 并发编程系列文章-Java线程的创建方式

    文章目录 继承Thread类 实现Runnable接口 使用Callable和Future创建有返回值的线程 使用Executor框架创建线程池 几个关键类的关系图 实战例子 常见的Java线程的4中方式包括 继承Thread类 实现Run
  • 用docker命令时报错,提示:Cannot connect to the Docker daemon at unix:///var/run/docker.sock.

    报错现象 root node02 docker ps Cannot connect to the Docker daemon at unix var run docker sock Is the docker daemon running
  • 工作中报错故障集合

    OOM常见报错排查之堆外内存溢出 报错 ExecutorLostFailure executor xxx exited caused by one of the running tasks Reason Container killed b
  • numpy和torch的一些操作

    1 如何把数据从1维扩充成2维 np expand dims x1 axis 1 或者x1 x1 None 从 2 33075 换成两个 1 33075 x1 x1 None 2 numpy trace array 返回数组沿对角线元素的和
  • Unet网络搭建(Pytorch)

    Unet是一个经典的语义分割网络 常常被用于医学影像的分割 在Unet的网络结构中 可以分为卷积模块 下采样模块以及上采样模块 详见下面的网络结构图 在网络的搭建过程中 也是依照分为三大块这种思路进行搭建 话不多说 直接上代码 import
  • Ubuntu 12.04 64位编译android 4.1.1_r3

    一 初始化编译环境 google推荐的编译环境是在Ubuntu LTS 10 04 但是新的LTS版本12 04已经出来 没必要在旧版本上做文章了 很多行特性和驱动10 04上都没有 例如无线网卡驱动 所以果断选择12 04的LTS版本 对
  • NSGA2算法原理及python实现

    git参考代码 Program Name NSGA II py Description This is a python implementation of Prof Kalyanmoy Deb s popular NSGA II algo
  • Python软件编程等级考试三级——20200913B

    Python软件编程等级考试三级 20200913B 理论 单选题 判断题 实操 第一题 第二题 第三题 理论 单选题 1 关于利用CSV模块对文件进行操作 下列描述不正确的是 A CSV是一种常用的文本格式 使用逗号分隔值的 B CSV模
  • DBus 介绍

    一 什么是 DBus D Bus是一个为应用程序间通信的消息总线系统 用于进程之间的通信 1 1 三层架构 1 函数库libdbus gt gt gt gt gt 用于两个应用程序互相联系和交互消息 2 基于 libdbus 构造的消息总线
  • 《Java进阶学习+面试宝典》高级架构师指南-剑指阿里P8

    企业对Java的需求最大 Java程序员的群体也最为庞大 有着 1200万之多 彼此之间都有更多的选择 换句话说 也是最修罗场的 要想在明年的金三银四拿下自己心仪的offer 咱就一定要做好功课 把那些必考点 套路都给吃透了 为此我专门整理
  • Spring Data CrudRepository增删改查方法(八)

    CrudRepository 的主要方法 long count boolean exists Integer arg0
  • 数据结构有哪些

    概念 数据结构 数据用什么样的方式组合在一起 数据结构是计算机存储数据的方式 指相互之间存在一种或多种特定关系的数据元素集合 常见数据结构 数据存储的常用结构有 栈 队列 数组 链表和红黑树 栈 stack 又称堆栈 它是运算受限的线性表