# 数据结构

#

  • 先进后出,后进先出

  • 一端开口 栈顶;一端封闭 栈底

# 队列

  • 先进先出,后进后出

  • 一端开口 后端;一端开头 前端

# 数组

  • 在内存中一块在一起的元素,是一种查询快、增删慢的数据模型
  • 查询速度快:通过地址值和索引定位,查询任意数据时间复杂度相同
  • 删除效率低:将一个数据删除后,后面的每个数据都需要前移
  • 添加(插入)效率极地:添加位置后每个数据后移,再添加元素

# 链表

  • 在内存中是分散的

  • 每个存储单位是一个节点,是一个单独的对象

    • 节点有自己的地址
    • 头节点存储第一个节点的地址(单向链表)或者存储第一个节点的地址和最后一个节点的地址(双向链表)
    • 单向链表中节点中存储具体数据和下一个节点的地址
    • 双向链表中节点中存储前一个节点的地址、具体数据、下一个节点的地址image-20220901221015555
  • 链表增删较快、查询慢、首尾操作极快


# 二叉树

  1. 树形数据结构

  2. 度:每个节点的子节点数量

  3. 树高:树的总层数

  4. 根节点:最顶层的节点

  5. 左子节点:左下方的节点;右子节点:右下方的节点

  6. 根节点的左子树

    image-20220903093328908

  7. 二叉树中,任意节点的度<= 2

  8. 每个节点有一个父节点,一个左子节点,一个右子节点

  9. 节点的结构

image-20220903092701929


# 二叉查找树

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

# 存储规则

  • 小的存左边
  • 大的存右边
  • 一样的不存

# 二叉树遍历

# 前序遍历

从根节点开始,然后按照当前节点,左子节点,右子节点的顺序遍历

# 中序遍历(常用)

从最左边的子节点开始,然后按照左子节点,当前节点,右子节点的顺序遍历。

遍历出来的数据(二叉查找树)是从大到小排序的,因此最常用

# 后序遍历

从最左边的子节点开始,然后按照左子节点,右子节点,当前节点的顺序遍历

# 层序遍历

从根节点开始一层一层的遍历


# 平衡二叉树

***任意节点***左右子树高度差不超过1

# 左旋

  • 确定支点:从添加的节点开始,不断的往父节点找不平衡的节点
# 支点非根节点
  1. 以不平衡的点作为支点
  2. 把支点左旋降级,变成左子节点
  3. 晋升原来的右子节点
# 支点为根节点
  1. 以不平衡的点作为支点
  2. 将根节点的右侧往左拉
  3. 原先的右子节点变成新的父节点,并把多余的左子节点出让,给已经降级的根节点当右子节点

# 右旋

与左旋同理

# 需要旋转的四种情况

  1. 左左:当根节点左子树的左子树有节点插入,导致二叉树不平衡
    • 一次右旋即可
  2. 左右:当根节点左子树的右子树右节点插入,导致二叉树不平衡
    • 先局部左旋,在整体右旋
  3. 右右:当根节点右子树的右子树右节点插入,导致二叉树不平衡
    • 一次左转即可
  4. 右左:当根节点右子树的左子树有节点插入,导致二叉树不平衡
    • 先局部右旋,在整体左旋

# 红黑树

  • 是一个二叉查找树
  • 但不是高度平衡的
  • 条件:特有的红黑规则

# 红黑规则

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

# 添加规则

  • 默认颜色:添加节点的默认颜色是红色

image-20220903145748193