数据结构
线性结构
- 一个有序数据元素的集合
- 其中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的
非线性结构
- 线性结构的对立面
数组
定义
数组是一种线性数据结构,用于存储相同类型的元素。
每个元素都有一个唯一的索引,通过索引可以快速访问数组中的元素。
特点
-
数组的长度是固定的,一旦创建就不能更改。
-
元素在内存中是连续存储的。
-
支持随机访问,通过索引可以直接访问数组中的任意元素。
链表
定义
链表是一种线性数据结构,由节点(Node)组成,每个节点包含数据和一个指向下一个节点的指针。
特点
-
链表允许动态分配内存空间,大小不固定。
-
节点在内存中可以不连续存储,通过指针连接。
-
插入和删除节点的操作效率高,但访问效率较低。
队列(Queue)
定义
队列是一种基于先进先出(First In First Out,FIFO)原则的线性数据结构。
特点
-
主要操作包括入队(Enqueue)和出队(Dequeue)
-
只能在队尾入队,在队头出队
-
常用于任务调度、广度优先搜索等场景
栈(Stack):
定义
栈是一种基于后进先出(Last In First Out,LIFO)原则的线性数据结构。
特点
-
主要操作包括压栈(Push)和出栈(Pop)
-
只能在栈顶进行插入和删除操作
-
常用于跟踪方法调用、表达式求值、内存管理等场景
树(Tree):
定义
-
树是一种非线性的数据结构,由节点(Node)和边(Edge)组成。
-
每个节点包含数据元素,而边定义了节点之间的关系。
-
树的一个特殊节点称为根(Root),根节点没有父节点,其他节点都有一个父节点。
-
每个节点可以有零个或多个子节点,同一层级上的节点称为兄弟节点。
-
树的常见类型包括二叉树、二叉搜索树、平衡树、红黑树等。
二叉树(Binary Tree)
- 定义:每个节点最多有两个子节点,分左右
- 遍历:
- 前序:中左右(根左右)
- 中序:左中右(左根右)
- 后序:左右中(左右根)
二叉搜索树(Binary Search Tree)
- 定义:
- 二叉搜索树是一种有序的二叉树
- 对于每个节点,其左子树的所有节点值小于节点本身的值,右子树的所有节点值大于节点本身的值
- 查询
- 平均时间的时间复杂度为 O(log n),最差情况为 O(n)
AVL 树(Balanced Binary Search Tree)
- 定义: AVL 树是一种自平衡的二叉搜索树,它确保任意节点的左右子树的高度差不超过 1
- 查询:时间复杂度为 O(log n)
- 插入、删除:
- 由于插入或删除导致左右子树的高度差大于1,此时需要旋转某些节点调整树高度,使其再次达到平衡状态
- 左旋:
- 右旋:
红黑树(Red-Black Tree)
- 定义: 红黑树是一种自平衡的二叉搜索树,通过在每个节点上增加额外的颜色信息(红色或黑色),来确保树的平衡