数据结构
数据结构是计算机存储、组织数据的方式。
不同场景要选择不同的数据结构。
-
常见的数据结构:
栈、队列、数组、链表、二叉树、二叉查找树、平衡二叉树、红黑树
核心:
1. 每种数据结构长什么样子?
1. 如何添加数据?
1. 如何删除数据?
1. 栈
**特点:**后进先出,先进后出。
2. 队列
**特点:**先进先出,后进后出。
3. 数组
**特点:**查询快,增删慢。
- 查询速度快:通过地址值和索引定位,查询任意数据耗时相同(元素在内存中是连续存储的)。
- 删除效率低:删除一个元素,同时后面每个元素前移。
- 添加效率低:添加一个元素,同时后面的每个元素要后移。
4. 链表
**特点:**查询慢,增删相对快。
链表中的结点是独立的对象,在内存中是不连续的,每个结点包含数据值和下一个结点的地址。
- 查询慢:无论查询哪个数据都要从头开始找。
- 增删相对快:找到要插入的地址,插入结点记录下一个结点的地址,插入结点的上一个结点记录插入结点的地址,添加元素完毕;找到要删除的元素,使其上一个元素指向被删除元素的下一个元素,删除元素完毕。
5. 树
一个节点的内部结构:父节点地址、左子节点地址、右子节点地址、自身数据值。
基本概念:
- 度:每一个节点的子节点数量(二叉树中任意节点的度≤2);
- 树高:树的总层数;
- 根节点:最顶层的节点。
5.1 二叉树
**二叉树包括:**普通二叉树、二叉查找树、平衡二叉树、红黑树。
**普通二叉树:**任意节点的度≤2,对排序没有要求。
**弊端:**排序无规律,查找元素只能遍历,效率低。
5.2 二叉查找树(二叉排序树/二叉搜索树)
- 每一个节点上最多有两个子节点;
- 任意节点左子树上的值都小于当前节点;
- 任意节点右子树上的值都大于当前节点。
**添加节点规则:**小的存左边,大的存右边,一样的不存。
**弊端:**如果数据分布极度不均匀,会出现左右子树高度差距很大的情况,导致查找困难。
5.3 平衡二叉树
查找节点时,从根节点开始,进行比较查找。
5.3.1 添加节点规则:
-
小的存左边,大的存右边,一样的不存;
-
任意节点左右子树高度不超过1。
添加节点规则相对二叉查找树只多了第二条:任意节点左右子树高度不超过1,这保证了左右子树高度平衡,是对二叉查找树的优化。
5.3.2 旋转:
旋转分为左旋和右旋,可以保证树一直是一颗平衡二叉树。
**触发旋转的时机:**当添加一个节点后,该树不再是一颗平衡二叉树,即某节点左右子树高度差不满足规则了。
介绍一下支点:
**确定支点:**从添加的节点开始,不断地向父节点找不平衡的节点。
左旋:
- 以不平衡的点作为支点;
- 把支点左旋降级,变成左子节点;
- 晋升原本的右子节点。
右旋:
- 以不平衡的点作为支点;
- 把支点右旋降级,变成右子节点;
- 晋升原本的左子节点。
需要旋转的四种情况:
注释:如根节点的左子树的左子树有节点插入,导致二叉树不平衡,以下称为“左左”,其他情况类推:
-
左左:一次右旋;
-
左右:先局部左旋,再整体右旋;
在这里局部左旋,其实就是由“左右”转换为了“左左”的情况。
-
右右:一次左旋;
-
右左:先局部右旋,再整体左旋。
在这里局部右旋,其实就是由“右左”转换成了“右右”的情况。
5.4 红黑树(平衡二叉B树)
5.4.1 定义
红黑树是一种特殊的二叉查找树,红黑树不是高度平衡的。
红黑树的每一个节点上都有存储位表示节点的颜色,每一个节点可以是红或者黑,它的平衡是通过“红黑规则”进行实现的。
5.4.2 红黑规则
-
每一个节点或是红色,或是黑色的;
-
根节点必须是黑色的;
-
如果一个节点没有子节点或者父节点,则该节点对应的属性值为Nil,这些Nil视为叶节点,每个叶节点(Nil)是黑色的;
-
如果某一个节点是红色的,那它的子节点必须是黑色的(不能出现两个红色节点相连的情况);
简略:两个红色节点不能相连。
5.4.3 红黑树添加元素规则
默认颜色:添加节点默认是红色的(效率高)。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qRb1T1xU-1682067372422)(D:\java\java学习\我的笔记\图片\红黑树添加元素规则.png)]
节点必须是黑色的(不能出现两个红色节点相连的情况);
简略:两个红色节点不能相连。
5.4.3 红黑树添加元素规则
默认颜色:添加节点默认是红色的(效率高)。
[外链图片转存中…(img-qRb1T1xU-1682067372422)]
*红黑树的增删改查的性能都很好。