LeetCode | 从树到图:深度剖析数据结构与算法的核心精髓

server/2025/1/19 2:42:23/

在 LeetCode 的算法题中,树与图是两类不可或缺的重要数据结构。无论是探索二叉树的深度,还是解决复杂的最短路径问题,树与图的应用无处不在。它们不仅是计算机科学的基石,也是提升算法能力的关键。

1.理论

1.1.树与图的基础概念

1.1.1.树 (Tree)

是一种特殊的图,是无环、连通的图,常见类型有二叉树、二叉搜索树 (BST)、完全二叉树等。

特点:节点之间有父子关系;每个节点最多只有一个父节点,根节点没有父节点;边的数量 = 节点数量 - 1。

1.1.2.图 (Graph)

图是由节点 (Vertices) 和边 (Edges) 组成的结构,可以是有向图或无向图,带权图或无权图。

特点:可包含环 (Cycle);节点可以没有父子关系;常用的表示方法有邻接矩阵邻接表

1.2.常见问题分类

1.2.1.树的经典问题

二叉树遍历

  • 前序遍历 (Preorder): 根 - 左 - 右
  • 中序遍历 (Inorder): 左 - 根 - 右
  • 后序遍历 (Postorder): 左 - 右 - 根
  • 层序遍历 (Level Order Traversal): 一层一层从上到下遍历。

树的构建

  • 根据前序和中序遍历序列构建二叉树。
  • 根据中序和后序遍历序列构建二叉树。

树的属性

  • 最大深度、最小深度。
  • 是否平衡二叉树。
  • 二叉搜索树的验证。

树的修改与路径

  • 最近公共祖先 (LCA)。
  • 求根到叶子的路径和。
  • 二叉树的直径问题。
1.2.2.图的经典问题

图的遍历:深度优先搜索 (DFS)和广度优先搜索 (BFS)

最短路径问题

  • Dijkstra 算法:单源最短路径,适用于带权图。
  • Bellman-Ford 算法:适用于带权图,允许负权边。
  • Floyd-Warshall 算法:多源最短路径。

连通性问题

  • 判断连通分量的个数。
  • 判断图是否是二分图。

拓扑排序

  • Kahn 算法
  • 基于 DFS 的拓扑排序。

最小生成树 (MST)

  • Prim 算法:基于贪心。
  • Kruskal 算法:基于边的排序和并查集。

网络流问题:最大流:Edmonds-Karp 算法,Ford-Fulkerson 算法

 1.3.关键算法模板

1.3.1.DFS 模板

def dfs(node, visited):if node in visited:returnvisited.add(node)for neighbor in graph[node]:dfs(neighbor, visited)

1.3.2.BFS 模板

from collections import dequedef bfs(start):queue = deque([start])visited = set()visited.add(start)while queue:node = queue.popleft()for neighbor in graph[node]:if neighbor not in visited:visited.add(neighbor)queue.append(neighbor)

1.3.3.二叉树递归遍历模板

def inorder_traversal(root):if not root:return []return inorder_traversal(root.left) + [root.val] + inorder_traversal(root.right)

2.真题

2.1.树相关

2.1.1.简单(Easy)

【Leetcode 94】二叉树的中序遍历

给定二叉树的 ,返回其节点值的中序遍历。

如果以空间复杂度优先:Morris 遍历是最优解,空间复杂度仅为 O(1)

如果以易读性优先:递归解法更清晰简单,适合初学者。

如果需要平衡效率和易读性:迭代解法是最常用的方法。

递归解法

# 中序遍历的顺序是:左子树 → 根节点 → 右子树。def inorderTraversal(root):def dfs(node):if not node:return []   #如果当前节点是 None(即递归到达叶子节点的子节点),返回空列表return dfs(node.left)+[node.val]+dfs(node.right) #拼接结果return dfs(root) #时间复杂度:O(n);空间复杂度:O(n)(递归调用栈)

【Leetcode 104】二叉树的最大深度

2.1.2.中等(Medium)

【Leetcode 94】二叉树的中序遍历

2.2.图相关

2.2.2.中等(Medium)

【Leetcode 200】岛屿的数量

【Leetcode236】课程表

【Leetcode236】网络延迟时间

参考文献

【1】 Trees vs. Graphs - Open4Tech


http://www.ppmy.cn/server/159516.html

相关文章

Windows重装后NI板卡LabVIEW恢复正常

在重新安装Windows系统后,NI(National Instruments)板卡能够恢复正常工作,通常是由于操作系统的重新配置解决了之前存在的硬件驱动、兼容性或配置问题。操作系统重装后,系统重新加载驱动程序、清理了潜在的冲突或损坏的…

docker运行镜像命令

#运行tdengine docker run -d --name tdengine -e TZAsia/Shanghai -v D:\develop\docker_app_data\taos\log:/var/log/taos -v D:\develop\docker_app_data\taos\data:/var/lib/taos -p 6041-6060:6041-6060 -p 6043-6060:6043-6060/udp -d tdengine/tdengine #运行emqx dock…

《在ArkTS中实现模型的可视化调试和监控:探索与实践》

在当今人工智能与鸿蒙Next深度融合的时代,利用ArkTS开发高效智能应用成为开发者们关注的焦点。而模型的可视化调试和监控对于确保模型的准确性和性能至关重要,本文将深入探讨在ArkTS中实现这一目标的方法和实践。 ArkTS与模型开发基础 ArkTS作为一种基…

MarsCode青训营打卡Day1(2025年1月14日)|稀土掘金-16.最大矩形面积问题

资源引用: 最大矩形面积问题 - MarsCode 打卡小记录: 今天是开营第一天,和小伙伴们组成了8人的团队,在接下来的数十天里相互监督,打卡刷题! 稀土掘金-16.最大矩形面积问题(16.最大矩形面积问题…

Ubuntu 文件夹用途

Ubuntu 文件夹用途 bin: 存放可执行文件,包括系统命令和应用程序。boot: 包含启动相关的文件,如内核和引导加载器。cdrom: 用于挂载CD-ROM驱动器。dev: 包含设备文件,代表系统中的硬件设备。etc: 存放系统配置文件。 /etc/passwd: 存储用户账…

Spring boot 集成分布式定时任务

Spring boot 集成分布式定时任务 定义及作用 在分布式定时任务中&#xff0c;需要一种机制来确保同一任务在不同的服务实例中不会同时执行&#xff0c;这就是分布式定时任务锁的作用。 集成 引入相关依赖 <!--shedlock--><dependency><groupId>net.java…

【数据结构】线性表-单链表

线性表-单链表 顺序表链表存储结构单链表初始化插入数据头插法尾插法在指定位置插入数据 遍历链表删除节点获取链表长度释放链表 顺序表 上一篇文章 链表介绍&#xff1a; 线性表链式存储结构的特点是&#xff1a;用一组任意的存储单元存储线性表的数据元素(这组存储单元可以…

如何在亚马逊云科技上大幅降低无服务器网页应用冷启动时间(上篇)

背景 我们在云端搭建无服务器&#xff08;serverless&#xff09;开发架构时&#xff0c;经常会被冷启动&#xff08;cold start&#xff09;带来的应用延迟所困扰。冷启动是指当无服务器资源在一段时间内未被调用&#xff0c;或需要扩展以处理新请求时&#xff0c;系统需要初…