三十五、数据结构
数据存储的常用结构有:栈、队列、数组、链表、树、哈希表。
1、栈结构
概述:
栈:stack,又称堆栈,它是运算受限的线型表,其限制是仅允许在标的一端进行插入和删除操作,不允许在其他任何位置进行添加,删除等操作
特点: 先进后出。
有两个名词:
- 压栈:就是存元素。即,把元素存储到栈的顶端位置,栈中已有元素依次向栈底方向移动一个位置。
- 弹栈:就是取元素。即,把栈的顶端位置元素取出,栈中已有元素依次向栈顶方向移动一个位置。
2、队列
概述:
队列:queue,简称队,它同堆栈一样,也是一种运算受限的线性表,其限制是仅允许在表的一端进行插入,而在表的另一端进行取出并删除。
特点:先进先出

3、数组
特点:查询快,增删慢

4、链表
特点:增删快,查询慢

添加数据

查询数据

双向列表

5、二叉树
树的组成
| 名词 | 含义 |
|---|---|
| 节点 | 指树中的一个元素 |
| 节点的度 | 节点拥有的子树的个数,二叉树的度不大于2 |
| 叶子节点 | 度为0的节点,也称之为终端结点 |
| 左子节点 | 节点指向左边的是左子节点 |
| 右子节点 | 节点指向右边的是右子节点 |
| 左子树 | 节点左侧部分的树 为左子树 |
| 右子树 | 节点右侧部分的树 为右子树 |
| 高度 | 叶子结点的高度为1,叶子结点的父节点高度为2,以此类推,根节点的高度最高 |
| 层 | 根节点在第一层,以此类推 |
| 父节点 | 若一个节点含有子节点,则这个节点称之为其子节点的父节点 |
| 子节点 | 子节点是父节点的下一层节点 |
| 兄弟节点 | 拥有共同父节点的节点互称为兄弟节点 |
概述:
如果树中的每个节点的子节点的个数不超过2,那么该树就是一个二叉树
5.1 二叉查找树
二叉查找树又称 二叉排序树、二叉搜索树
二叉查找树的特点:
- 左子树上所有的节点的值均小于等于他的根节点的值
- 右子树上所有的节点值均大于或者等于他的根节点的值
- 每一个子节点最多有两个子树
注意:
二叉查找树存在的问题:会出现"瘸子"的现象,影响查询效率

5.2 平衡二叉树
概述:
为了避免出现"瘸子"的现象,减少树的高度,提高我们的搜素效率,又存在一种树的结构:"平衡二叉树"
平衡二叉树的特点:
- 它的左右两个子树的高度差不超过1
- 并且左右两个子树都是一棵平衡二叉树
如图所示:

6、哈希表
在JDK1.8之前,哈希表底层采用【数组 + 链表】实现,即使用数组处理冲突,同一hash值的链表都存储在一个数组元素里(如果内容也一样就进行删除)。但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低。
而JDK1.8中,哈希表存储采用【数组 + 链表 + 红黑树】实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。


浙公网安备 33010602011771号