数据结构有哪些

概念:

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

常见数据结构:

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

栈:

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. 叔叔节点为黑色
    将”父节点”设为黑色
    将”祖父节点”设为红色
    以”祖父节点”为支点进行旋转

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

matlab自考本科真题,行政管理学自考专科试题及答案

参考答案如下检查髌腱炎患者时可以发现()。A、行政学自股四头肌萎缩B、渗出C、髌反射低下D、Mcmurray试验时有卡嗒声/疼痛患者,管理男,30岁,患甲状腺功能亢进症,突然出现双下肢不能动。检查:双下肢膝腱反射…

php 关于日期的知识总结

1.UNIX时间戳 time() echo time(); 2.UNIX时间戳转换为日期用函数: date() 一般形式:date(Y-m-d H:i:s, 1156219870); 即 echo date(date(Y-m-d H:i:s, time())); 或 $showtime date(Y-m-d H:i:s,time()); 显示结果: 3.日期转换为UNIX时间…

php template strring,PHP字符串函数

<?php $str "THIS is a beautiful world!";//$newstr strstr($str,"is"); //区分大小写的//stristr 表示 $str里面第一次出现"is"的位置和之后的字符串//$newstr stristr($str,"is"); //不区分大小写$newstr stristr($str,&…

Java Calendar 类的时间操作

Java Calendar 类时间操作&#xff0c;这也许是创建和管理日历最简单的一个方案&#xff0c;示范代码很简单。 演示了获取时间&#xff0c;日期时间的累加和累减&#xff0c;以及比较。 原文地址&#xff1a;blog.csdn.NET/joyous/article/details/9630893 注意事项&#xff1a…

Java的异常入门

概念&#xff1a; 异常就是程序出现了不正常的情况&#xff0c;会导致JVM非正常停止&#xff0c;语法错误不算异常体系中 异常体系&#xff1a; 编译时异常&运行时异常&#xff1a; 虚拟机默认处理方式&#xff1a; 代码中出现异常&#xff0c;程序会先判断有没有处理异常的…

php是不是面向对象编程,PHP面向对象编程入门

1、常用术语说明class 类object 对象new 实例化member 类成员method 方法&#xff0c;成员函数property 属性&#xff0c;成员变量constant 类常量2、类的构造class ClassName{ //class关键字加类名//类中只能有三种成员&#xff1a;属性、类常量、方法&#xff0c;不限数量//成…

Java——多线程使用详解

多线程&#xff1a; 多线程就是同时执行多个应用程序&#xff0c;需要硬件的支持同时执行&#xff1a;不是某个时间段同时&#xff0c;cpu切换的比较快&#xff0c;所有用户会感觉是在同时运行 并发与并行&#xff1a; 并行(parallel)&#xff1a;指在同一时刻&#xff0c;有多…

Java面向对象编程思想

面向对象三个特征&#xff1a;封装、继承、多态封装&#xff1a; 语法&#xff1a;属性私有化&#xff08;private&#xff09;、提供相对应的get/set 的方法进行访问(public)、 在set/get的方法中对属性的数据 做相对应的业务逻辑的判断 思想&#xff1a;封装外面的程序…

php边框的颜色 怎么设置,网页中table表格如何修改边框颜色

table表格是网页制作中以前较常使用的一种布局方式&#xff0c;但随着DIVCSS的兴起&#xff0c;table表格已辉煌不在。但它在我们制作网页中也是时有用到。table表格也可以使用DIV一样随意的设置它的边框颜色。下面介绍一下二种方法。方法一&#xff1a;使用CSS代码控制边框颜色…

看懂线程安全

目录&#xff1a; 线程安全线程同步同步代码块同步方法Lock锁线程状态图sleep睡眠等待和唤醒 1. 线程安全 如果有多个线程在同时运行&#xff0c;而这些线程可能会同时运行这段代码。程序每次运行结果和单线程运行的结果是一样 的&#xff0c;而且其他的变量的值也和预期的是…

oracle数据库生产,从安装系统到oracle数据库生产环境(centos6.8)搭建

大纲服务器安装JDK配置Oracle数据库安装配置1.安装服务器服务器的安装参考这篇教程关于安装中可能出现的几个问题&#xff0c;在这里进行解决&#xff1a;1、使用u盘安装完后&#xff0c;系统进入GRUB引导&#xff0c;无法启动&#xff1a;解决办法&#xff1a;出现上述状况的原…

WSDL4J解析WSDL文件方法

利用wsdl4j解析WSDL文件 工具&#xff1a;wsdl4j1.6 解析wsdl文件是axis1.4的服务wsdl文件 wsdl文件&#xff1a; <?xml version"1.0" encoding"UTF-8" ?>- <wsdl:definitions targetNamespace"http://localhost:8080/axis/services/SayH…

详解线程池

概念&#xff1a; 什么是线程池: 线程池是用来存储多线程的容器&#xff0c;是一种处理形式&#xff0c;处理过程中将任务添加到队列&#xff0c;然后在创建线程后自动启动这些任务。 线程池使用和不使用的区别&#xff1a; 因为系统创建线程池的成本很高&#xff0c;会涉及到…

git revert

1. 我认为这是正确的做法&#xff1a; git fetch --all git reset --hard origin/mastergit fetch下载远程最新的&#xff0c;但不尝试&#xff0c;或重订任何东西。 然后&#xff0c;git resetmaster分支重置到你刚才牵强。 2. 试试这个&#xff1a; git reset --hard HEAD gi…

oracle 内存分配,Oracle调优修改10g,11g内存分配

先查看数据库是否使用spfile启动&#xff0c;如果不是的话&#xff0c;只需要在pfile中修改&#xff0c;然后重启数据库即可SQL> show parameter spfile;NAME TYPE VALUE------------------------------------ ----------- ------------------------------spfile string D:\…

在sql server数据库的一个表中如何查询共有多少字段

select a.* from sys.columns a,sys.tables bwhere a.object_id b.object_id and b.name 要查的表名转载于:https://www.cnblogs.com/firstdream/p/6899224.html

oracle自带的sql语言环境变量,Oracle技术网—SQL*Plus系统环境变量有哪些?如何修改?...

实现方法&#xff1a;show和set命令是两条用于维护SQL*Plus系统变量的命令SQL> show all--查看所有68个系统变量值SQL> show user--显示当前连接用户SQL> show error                --显示错误SQL> set heading off--禁止输出列标题&#xff0c;默…

第二个冲刺周期第二天

昨天实现了基本登录界面&#xff0c;今天对登录界面进行了进一步完善&#xff0c;遇到的问题就是如何把登录跟主界面连接起来&#xff0c;明天继续完善登录界面。转载于:https://www.cnblogs.com/1998lu/p/6926154.html

oracle 导出数据 utl,使用utl_file做选择性数据导出

在平时的数据导出中使用exp/expdp能够满足绝大部分的数据导出任务。如果有一些表的数据不多&#xff0c;但是查询条件要复杂一些&#xff0c;使用exp/expdp就很吃力了。或者在和外部系统的交互中&#xff0c;使用xml或者文本文件是一个很兼容的选择&#xff0c;这个时候使用exp…

oracle 10g express linux,在Ubuntu下安装Oracle Database 10g Express Edition

Oracle 10g有一款XE版&#xff0c;意为体验版&#xff0c;限制是不支持多CPU和数据库大小不能超过2G(还有其他的什么&#xff0c;不记得了&#xff0c;Oracle官方网站有写)。对于开发的时候调试一下&#xff0c;体验一下还是够用的。关键大小比较适中&#xff0c;安装包200多M。…