一、图的基本概念
在力扣中,“图”通常指由 顶点(Nodes / Vertices) 和 边(Edges) 组成的数据结构。图可以是:
- 有向图(Directed Graph):边有方向,例如
A -> B
表示只能从 A 到 B。 - 无向图(Undirected Graph):边无方向,例如
A - B
表示 A 可以到 B,B 也可以到 A。 - 带权图(Weighted Graph):边有权重(cost、距离等)。
- 无权图(Unweighted Graph):边没有权重。
在力扣中,“图”通常指由 顶点(Nodes / Vertices) 和 边(Edges) 组成的数据结构。图可以是:
A -> B
表示只能从 A 到 B。A - B
表示 A 可以到 B,B 也可以到 A。完全可以先确认一点:在图中,理论上只要能用 DFS 遍历的图,也可以用 BFS 遍历,因为两者都是遍历整个连通分量的算法。
它们的根本区别不在“能否遍历”,而在遍历顺序、应用场景和性能差异。
下面详细分析:
特性 | DFS | BFS |
---|---|---|
遍历顺序 | 深度优先,尽可能沿一条路径走到底再回溯 | 广度优先,按层(距离起点的步数)访问 |
数据结构 | 栈 / 递归调用栈 | 队列 |
访问顺序 | 先访问子节点最深的路径 | 先访问距离起点最近的节点 |
适用场景 | 搜索路径、连通分量、拓扑排序、回溯 | 最短路径(无权图)、层序问题、分层处理 |
性能 | 空间复杂度受递归深度影响(最坏 O(V)) | 空间复杂度受队列影响(最坏 O(V)) |
在图论中,**连通性(Connectivity)**描述图中节点之间可达的关系:
节点可达(Reachability):如果存在一条从节点 A 到节点 B 的路径,则称 A 可达 B。
连通图(Connected Graph):
无向图:如果任意两个节点之间都有路径,称图是连通的。
有向图:
并查集是一种用于 动态维护不相交集合(Disjoint Sets) 的数据结构,核心目的是快速判断元素是否属于同一个集合,以及将两个集合合并。
用途:
核心思想:
堆是一种 完全二叉树(Complete Binary Tree) 的数据结构,同时满足 堆性质(Heap Property):
特点:
顾名思义,就是一个节点分出两个节点,称其为左右子节点;每个子节点又可以分出两个子节点,这样递归分叉,其形状很像一颗倒着的树。
二叉树限制了每个节点最多有两个子节点,没有子节点的节点称为叶子。
二叉树引导出很多名词概念,这里先不做系统介绍,遇到时再结合例子一一说明。
如下一个二叉树:
/* A simple binary tree
* A ---------> A is root node
* / \
* / \
* B C
* / / \
* / / \
* D E F ---> leaves: D, E, F
*
* (1) ---> Height: 3
*/
前面我们学习了 java 如何实现 binary search 二分查找法?。
那么,有没有一种数据结构,可以让我们更好的实现二分查找呢?
有的,那就是我们今天的二叉查询树。
让我们从二叉树开始,一起完成这次查询的学习之旅吧。
顾名思义,就是一个节点分出两个节点,称其为左右子节点;每个子节点又可以分出两个子节点,这样递归分叉,其形状很像一颗倒着的树。
AVL树是根据它的发明者G.M. Adelson-Velsky和E.M. Landis命名的。
它是最先发明的自平衡二叉查找树(Self-balancing binary search tree),也被称为高度平衡树。
红黑树(英语:Red–black tree)是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。
它是在1972年由鲁道夫·贝尔发明的,他称之为"对称二叉B树",它现代的名字是在Leo J. Guibas和Robert Sedgewick于1978年写的一篇论文中获得的。
它是复杂的,但它的操作有着良好的最坏情况运行时间,并且在实践中是高效的:它可以在 O(lg(n))
时间内做查找,插入和删除,这里的 n 是树中元素的数目。
红黑树和AVL树一样都对插入时间、删除时间和查找时间提供了最好可能的最坏情况担保。