1. 树结构算法概述
树是计算机科学中最基础也最重要的数据结构之一,广泛应用于文件系统、数据库索引、游戏AI等领域。在处理树结构问题时,我们通常需要遍历整棵树来搜索特定节点或验证某些属性。根据遍历顺序和方向的不同,主要分为以下几种经典方法:
- 颜色标记法:通过给节点"着色"来记录访问状态
- BFS(广度优先搜索):按层级逐层遍历
- 自顶向下DFS:从根节点开始递归处理
- 自底向上DFS:先处理子树再处理当前节点
这几种方法各有特点,适用于不同场景。下面我将结合具体代码示例,详细解析每种方法的实现原理和适用场景。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 颜色标记法详解
2.1 基本思想与实现
颜色标记法本质上是DFS的一种变体,通过给节点赋予不同"颜色"来标记其访问状态。典型的三色标记法实现如下:
python复制WHITE = 0 # 未访问
GRAY = 1 # 访问中
BLACK = 2 # 已访问完成
def dfs(node):
if node.color == BLACK:
return
if node.color == GRAY:
raise Exception("检测到环")
node.color = GRAY
for child in node.children:
dfs(child)
node.color = BLACK
这种方法的优势在于:
- 可以清晰判断节点状态
- 容易检测环的存在
- 适合需要多次访问同一节点的场景
2.2 实际应用场景
颜色标记法特别适用于以下情况:
- 拓扑排序(课程安排、任务调度)
- 垃圾回收中的标记-清除算法
- 检测图中的环
提示:在实现时,可以用整数代替颜色枚举,节省内存空间。对于大规模图,可以考虑使用位运算进一步优化。
3. BFS算法解析
3.1 标准实现模板
BFS使用队列数据结构,保证节点按层级顺序被访问。以下是Python实现示例:
python复制from collections import deque
def bfs(root):
if not root:
return
q
