当前位置: 首页 > news >正文

python二叉树的深度优先遍历和广度优先遍历

一、代码实现


from collections import dequeclass TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightdef dfs_preorder(root):"""前序遍历 (根-左-右)"""if not root:return []return [root.val] + dfs_preorder(root.left) + dfs_preorder(root.right)def dfs_inorder(root):"""中序遍历 (左-根-右)"""if not root:return []return dfs_inorder(root.left) + [root.val] + dfs_inorder(root.right)def dfs_postorder(root):"""后序遍历 (左-右-根)"""if not root:return []return dfs_postorder(root.left) + dfs_postorder(root.right) + [root.val]def bfs(root):"""广度优先遍历 (层级遍历)"""if not root:return []queue = deque([root])result = []while queue:# 使用高性能队列deque,popleft操作时间复杂度为O(1),而列表的pop(0)方法操作时间复杂度O(n)node = queue.popleft()result.append(node.val)if node.left:queue.append(node.left)if node.right:queue.append(node.right)return resultif __name__ == "__main__":# 构建示例二叉树#       1#      / \#     2   3#    / \#   4   5root = TreeNode(1)root.left = TreeNode(2)root.right = TreeNode(3)root.left.left = TreeNode(4)root.left.right = TreeNode(5)print("DFS 前序遍历:", dfs_preorder(root))print("DFS 中序遍历:", dfs_inorder(root))print("DFS 后序遍历:", dfs_postorder(root))print("BFS 层级遍历:", bfs(root))

二、dfs递归过程分析

dfs前序遍历结果为: [1, 2, 4, 5, 3]

分析过程如下:

1访问根节点1‌ → 结果: [1]

2递归左子树(2)‌:

  • 访问节点2 → 结果: [1, 2]
  • 递归左子树(4):
    • 访问节点4 → 结果: [1, 2, 4](无子节点,返回)
  • 递归右子树(5):
    • 访问节点5 → 结果: [1, 2, 4, 5](无子节点,返回)

3递归右子树(3)‌:

  • 访问节点3 → 结果: [1, 2, 4, 5, 3](无子节点,返回)
http://www.dtcms.com/a/328891.html

相关文章:

  • OpenAI官方写的GPT-5 prompt指南
  • Prompt工程师基础技术学习指南:从入门到实战
  • 实战多屏Wallpaper壁纸显示及出现黑屏问题bug分析-学员作业
  • 理解RESTful架构:构建优雅高效的Web服务
  • 直播美颜SDK开发实战:高性能人脸美型的架构与实现
  • STM32HAL 快速入门(六):GPIO 输入之按键控制 LED
  • 代码架构之 BO、PO、DTO
  • 边缘计算:数据处理新范式的革命性架构
  • Dots.ocr:告别复杂多模块架构,1.7B参数单一模型统一处理所有OCR任务22
  • 系统垃圾清理批处理脚本 (BAT)
  • 电子电气架构 --- 软件项目文档管理
  • OpenCVSharp中的HDR成像
  • 杂记 01
  • electron进程间通信- 从渲染进程到主进程
  • Spring cloud集成ElastictJob分布式定时任务完整攻略(含snakeyaml报错处理方法)
  • 移动端网页调试实战,触摸事件穿透与点击冲突问题的定位与优化
  • C++中的`auto`与`std::any`:功能、区别与选择建议
  • CV 医学影像分类、分割、目标检测,之【肝脏分割】项目拆解
  • 数据挖掘常用公开数据集
  • [爬虫实战] 基于半自动化的cookie池更新逻辑讲解
  • 数据分析总结
  • MyBatis 中 XML 与 DAO 接口的位置关系及扫描机制详解
  • 把 Linux 装进“小盒子”——边缘计算场景下的 Linux 裁剪、启动与远程运维全景指南
  • 关于Google Pixel,或者安卓16,状态栏颜色无法修改的解决方案
  • 双屏加固笔记本电脑C156-2:坚固与高效的完美融合
  • FPGA+护理:跨学科发展的探索(四)
  • 在CentOS 7上配置Android USB网络共享方式的方法
  • MacOS字体看起来比在 Windows 上更好?
  • HTTPS与CA证书:安全通信全解析
  • CA+https+动态WEB页面部署