常见的数据结构

数据结构

数据结构是计算机存储、组织数据的方式。

不同场景要选择不同的数据结构。

  • 常见的数据结构:

    栈、队列、数组、链表、二叉树、二叉查找树、平衡二叉树、红黑树

核心:

	1. 每种数据结构长什么样子?
	1. 如何添加数据?
	1. 如何删除数据?

1. 栈

**特点:**后进先出,先进后出。

2. 队列

**特点:**先进先出,后进后出。

3. 数组

**特点:**查询快,增删慢。

  • 查询速度快:通过地址值和索引定位,查询任意数据耗时相同(元素在内存中是连续存储的)。
  • 删除效率低:删除一个元素,同时后面每个元素前移。
  • 添加效率低:添加一个元素,同时后面的每个元素要后移。

4. 链表

**特点:**查询慢,增删相对快。

链表中的结点是独立的对象在内存中是不连续的,每个结点包含数据值和下一个结点的地址。

  • 查询慢:无论查询哪个数据都要从头开始找。
  • 增删相对快:找到要插入的地址,插入结点记录下一个结点的地址,插入结点的上一个结点记录插入结点的地址,添加元素完毕;找到要删除的元素,使其上一个元素指向被删除元素的下一个元素,删除元素完毕。

5. 树

一个节点的内部结构:父节点地址、左子节点地址、右子节点地址、自身数据值。

基本概念:

  1. 度:每一个节点的子节点数量(二叉树中任意节点的度≤2);
  2. 树高:树的总层数;
  3. 根节点:最顶层的节点。

5.1 二叉树

**二叉树包括:**普通二叉树、二叉查找树、平衡二叉树、红黑树。

**普通二叉树:**任意节点的度≤2,对排序没有要求。

**弊端:**排序无规律,查找元素只能遍历,效率低。

5.2 二叉查找树(二叉排序树/二叉搜索树)

  • 每一个节点上最多有两个子节点;
  • 任意节点左子树上的值都小于当前节点;
  • 任意节点右子树上的值都大于当前节点。

**添加节点规则:**小的存左边,大的存右边,一样的不存。

**弊端:**如果数据分布极度不均匀,会出现左右子树高度差距很大的情况,导致查找困难。

5.3 平衡二叉树

查找节点时,从根节点开始,进行比较查找。

5.3.1 添加节点规则
  1. 小的存左边,大的存右边,一样的不存;

  2. 任意节点左右子树高度不超过1。

添加节点规则相对二叉查找树只多了第二条:任意节点左右子树高度不超过1,这保证了左右子树高度平衡,是对二叉查找树的优化。

5.3.2 旋转

旋转分为左旋和右旋,可以保证树一直是一颗平衡二叉树。

**触发旋转的时机:**当添加一个节点后,该树不再是一颗平衡二叉树,即某节点左右子树高度差不满足规则了。

介绍一下支点:

**确定支点:**从添加的节点开始,不断地向父节点找不平衡的节点。

左旋:

  1. 以不平衡的点作为支点;
  2. 把支点左旋降级,变成左子节点;
  3. 晋升原本的右子节点。

右旋:

  1. 以不平衡的点作为支点;
  2. 把支点右旋降级,变成右子节点;
  3. 晋升原本的左子节点。

需要旋转的四种情况:

注释:如根节点的左子树的左子树有节点插入,导致二叉树不平衡,以下称为“左左”,其他情况类推:

  1. 左左:一次右旋;

  2. 左右:先局部左旋,再整体右旋;

    在这里局部左旋,其实就是由“左右”转换为了“左左”的情况。

  3. 右右:一次左旋;

  4. 右左:先局部右旋,再整体左旋。

    在这里局部右旋,其实就是由“右左”转换成了“右右”的情况。

5.4 红黑树(平衡二叉B树)

5.4.1 定义

​ 红黑树是一种特殊的二叉查找树,红黑树不是高度平衡的

​ 红黑树的每一个节点上都有存储位表示节点的颜色,每一个节点可以是红或者黑,它的平衡是通过“红黑规则”进行实现的。

5.4.2 红黑规则
  1. 每一个节点或是红色,或是黑色的;

  2. 根节点必须是黑色的;

  3. 如果一个节点没有子节点或者父节点,则该节点对应的属性值为Nil,这些Nil视为叶节点,每个叶节点(Nil)是黑色的;

  4. 如果某一个节点是红色的,那它的子节点必须是黑色的(不能出现两个红色节点相连的情况);

    简略:两个红色节点不能相连。

5.4.3 红黑树添加元素规则

默认颜色:添加节点默认是红色的(效率高)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qRb1T1xU-1682067372422)(D:\java\java学习\我的笔记\图片\红黑树添加元素规则.png)]

节点必须是黑色的(不能出现两个红色节点相连的情况);

简略:两个红色节点不能相连。

5.4.3 红黑树添加元素规则

默认颜色:添加节点默认是红色的(效率高)。

[外链图片转存中…(img-qRb1T1xU-1682067372422)]

*红黑树的增删改查的性能都很好。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值