数据结构

数据结构是计算机存储、组织数据的方式。是指相互之间存在一种或多种特定关系的数据元素的集合
通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率

数据结构-栈

数据进入栈模型的过程称为:压/进栈
数据离开栈模型的过程称为:弹/出栈

 

 栈是一种数据先进后出的模型

数据结构-队列

数据从后端进入队列模型的过程称为:入队列
数据从前端离开队列模型的过程称为:出队列

 

队列是一种数据先进先出的模型

数据结构-数组(ArrayList)

查询数据通过地址值和索引定位,查询任意数据耗时相同,查询速度快
删除数据时,要将原始数据删除,同时后面每个数据前移,删除效率低
添加数据时,添加位置后的每个数据后移,再添加元素,添加效率极低

 

数组是一种查询快,增删慢的模型

数据结构-链表(LinkedList)

  

单向列表

链表是一种增删快的模型(对比数组)
链表是一种查询慢的模型(对比数组)
  查询数据D是否存在,必须从头(head)开始查询
  查询第N个数据,必须从头(head)开始查询

双向列表

数据结构-树(TreeSet)

二叉树

度:每一个节点的子节点数量(二叉树中,任意一个节点的度要小于等于2)
A节点是BC的父节点;BC是A的子结点。
A节点度:2;B节点度:0;C节点度:0

最顶层的为:根节点
  4节点为7节点的左子节点
  10节点为7节点的右子节点
蓝色虚线:根节点的左子树;根节点的左子树高:3
绿色虚线:根节点的右子树;根节点的右子树高:3

 二叉查找树

二叉查找树,又称二叉排序树或者二叉搜索树。
特点:
  1.每一个节点上最多有两个子节点
  2.左子树上所有节点的值都小于根节点的值
  3.右子树上所有节点的值都大于根节点的值

平衡二叉树

二叉树左右两个子树的高度差不超过1
任意节点的左右两个子树都是一颗平衡二叉树

平衡二叉树-旋转

触发时机:当添加一个节点之后,该树不再是一颗平衡二叉树。

利用左旋和右旋机制保证树的平衡:

左旋

就是将根节点的右侧往左拉,原先的右子节点变成新的父节点,并把多余的左子节点出让,给已经降级的根节点当右子节点

右旋

将根节点的左侧往右拉,左子节点变成了新的父节点,并把多余的右子节点出让,给已经降级根节点当左子节点

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

左左

当根节点左子树的左子树有节点插入,导致二叉树不平衡

左右

当根节点左子树的右子树有节点插入,导致二叉树不平衡

右右

当根节点右子树的右子树有节点插入,导致二叉树不平衡

右左

当根节点右子树的左子树有节点插入,导致二叉树不平衡

红黑树

红黑树是一种自平衡的二叉查找树,是计算机科学中用到的一种数据结构。
1972年出现,当时被称之为平衡二叉B树。后来,1978年被修改为如今的"红黑树"。
它是一种特殊的二叉查找树,红黑树的每一个节点上都有存储位表示节点的颜色,
每一个节点可以是红或者黑;红黑树不是高度平衡的,它的平衡是通过"红黑规则"进行实现的

红黑规则

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

添加节点

 添加节点时,默认为红色,效率高。

针对以下数据:

1、当添加的节点为根节点时,因为规则2(根节点必须是黑色),直接将“红22”直接变成黑色就可以了。

2、父节点为黑色,添加“红18”及“红23”时,不需要任何操作。

3、添加“红22”时,因为规则4(不能出现两个红色节点相连的情况),需要进行调整:
观察:“红22”父节点“23”为红色,叔叔节点“18”也是红色
  1.将“父节点23”设为黑色,将“叔叔节点18”设为黑色
  2.将“祖父节点20”设为“红色”。
  3.如果祖父节点为根节点,则将根节点再次变成黑色。

由1、2得:由3得:

4、父节点为黑色,添加“红16”、“红24”、“红19”时,不需要任何操作。

5、添加“红15”时,因为规则4(不能出现两个红色节点相连的情况),需要进行调整:
观察:“红15”父节点“16”为红色,叔叔节点“19”也是红色
  1.将“父节点16”设为黑色,将“叔叔节点19”设为黑色
  2.将“祖父节点18”设为“红色”。
  3.如果祖父节点为根节点,则将根节点再次变成黑色。当前“祖父节点18”不是根节点,所以不用变。

由1、2、3得:

6、添加“红14”时,因为规则4(不能出现两个红色节点相连的情况),需要进行调整:
观察:“红14”父节点“15”为红色,叔叔节点“Nil”是黑色
  1.将“父节点15”设为“黑色”
  2.将“祖父节点16”设为“红色”。
  3.以祖父节点为支点进行旋转

由1、2得:

由3得:

总结:

红黑树在添加节点的时候:添加的节点默认是红色的。

以祖父节点为支点进行旋转时,看左右哪边长:如果左边长,进行右旋;如果右边长,进行左旋。

数据结构-哈希表(HashSet)

JDK8之前,底层采用数组+链表实现,可以说是一个元素为链表的数组。

JDK8以后,底层实现了优化。由数组+链表+红黑树实现。(当链表长度超过8的时候,自动转换为红黑树。)

 

posted @ 2023-06-14 21:39  溯鸣  阅读(26)  评论(0编辑  收藏  举报