前言
数据结构是计算机存储、组织数据的方式。是指相互之间存在一种或多种特定关系的数据元素的集合通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。
java中像集合,数组都有自己的数据结构。
栈
栈是一种数据先进后出的模型,遵循LIFO(Last In First Out)的原则
数据进入栈模型的过程称为:压/进栈
数据离开栈模型的过程称为:弹/出栈
队列
队列是一种数据先进先出的模型
数据从后端进入队列模型的过程称为:入队列
数据从前端离开队列模型的过程称为:出队列
数组
数组是一种查询快,增删慢的模型
查询数据通过地址值和索引定位,查询任意数据耗时相同,查询速度快
删除数据时,要将原始数据删除,同时后面每个数据前移,删除效率低
添加数据时,添加位置后的每个数据后移,再添加元素,添加效率极低
ArrayList底层数据结构就是数据
链表
链表分为单链表和双链表
单链表:
一个节点的后面存着后一个节点的地址(一个节点包括值和后一个节点的地址)
双链表:
一个节点的前面存着前一个节点的地址,后面存着后一个节点的地址(一个节点包括值和前后两个节点的地址)
链表是一种增删快的模型(对比数组)
查询数据D是否存在,必须从头(head)开始查询
查询第N个数据,必须从头(head)开始查询
LinkendList底层就是链表。
二叉树
节点:每个圈表示一个节点,一个节点包括值,父节点地址,两个子节点地址
度: 度表示每个节点的子节点数量,二叉树中,任意一个节点的度要小于等于2.
在这里插入图片描述
二叉查找树
二叉查找树,又称二叉排序树或者二叉搜索树。
特点:
1,每一个节点上最多有两个子节点
2,左子树上所有节点的值都小于根节点的值3,右子树上所有节点的值都大于根节点的值
平衡二叉树
判定标准:
1.二叉树左右两个子树的高度差不超过1
2.任意节点的左右两个子树都是一颗平衡二叉树
注意点:
判断添加元素与当前节点的关系
成功添加之后,判断是否破坏了二叉树的平衡 如果破坏了平衡就需要旋转来保持满足平衡二叉树的条件。
旋转
触发时机:
当添加一个节点之后,该树不再是一颗平衡二叉树
左旋
左旋就是将根节点的右侧往左拉,原先的右子节点变成新的父节点,并把多余的左子节点出让,给已经降级的根节点当右子节点
特点:
逆时针旋转
右子节点变成父节点(根节点)原先的根节点降级变成左子节点
将多余的左子节点出让,给降级的节点作为右子节点
右旋
右旋:将根节点的左侧往右拉,左子节点变成了新的父节点,并把多余的右子节点出让,给已经降级根节点当左子节点
特点:
顺时针旋转
左子节点变成父节点(根节点)原先的根节点降级变成右子节点
将多余的右子节点出让,给降级的节点作为左子节点
红黑树
红黑树是一种自平衡的二叉查找树,是计算机科学中用到的一种数据结构。
1972年出现,当时被称之为平衡二叉B树。后来,1978年被修改为如今的"红黑树"。
它是一种特殊的二叉查找树,红黑树的每一个节点上都有存储位表示节点的颜色,
每一个节点可以是红或者黑;红黑树不是高度平衡的,它的平衡是通过"红黑规则"进行实现的
红黑规则
1.每一个节点或是红色的,或者是黑色的。
2.根节点必须是黑色
3.如果一个节点没有子节点或者父节点,则该节点相应的指针属性值为Nil,这些Nil视为叶节点,每个叶节点(Nil)是黑色的;
4.如果某一个节点是红色,那么它的子节点必须是黑色(不能出现两个红色节点相连的情况)
5.对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点
平衡二叉树和红黑树的区别:
平衡二叉树是高度平衡的:
条件:当左右子树高度差超过1时——旋转
红黑树是一个二叉查找树,但是不是高度平衡的
条件:自己的红黑规则——旋转