news 2026/3/31 17:16:42

中序遍历(基于栈的非递归实现)和层序遍历(基于队列的实现)是二叉树遍历中的两种重要方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
中序遍历(基于栈的非递归实现)和层序遍历(基于队列的实现)是二叉树遍历中的两种重要方法

中序遍历(基于栈的非递归实现)和层序遍历(基于队列的实现)是二叉树遍历中的两种重要方法,分别体现了深度优先与广度优先的访问策略。

  1. 中序遍历(非递归,基于栈)
definorder_traversal(root):stack=[]result=[]current=rootwhilecurrentorstack:# 一直向左走到底,将路径上节点入栈whilecurrent:stack.append(current)current=current.left# 当前为空,弹出栈顶并访问current=stack.pop()result.append(current.val)# 访问节点current=current.right# 转向右子树returnresult

该方式模拟了递归调用的过程,通过显式使用栈来保存回溯路径,确保在访问完左子树后能正确回到根节点再进入右子树。

  1. 层序遍历(基于队列)
fromcollectionsimportdequedeflevel_order_traversal(root):ifnotroot:return[]queue=deque([root])result=[]whilequeue:node=queue.popleft()result.append(node.val)ifnode.left:queue.append(node.left)ifnode.right:queue.append(node.right)returnresult

利用先进先出的队列特性,保证每一层的节点按从左到右顺序被处理,适合用于求解树的层次结构相关问题,如层平均值、最大宽度等。

补充说明中强调:不同遍历方式生成的线性序列反映了不同的逻辑顺序。例如:

  • 中序遍历对二叉搜索树可得到升序序列;
  • 层序遍历则揭示了树的层级分布。

这些序列中所谓的“前驱”与“后继”关系依赖于具体的遍历规则,并无全局统一性。
前序遍历和后序遍历的非递归实现同样基于栈结构,但访问节点的顺序不同,因此入栈策略也有所区别。

1.前序遍历(根 → 左 → 右)非递归实现

核心思想:使用栈模拟递归过程。每次弹出一个节点并访问,然后先将其右子节点入栈,再将左子节点入栈(确保左子树优先被处理)。

defpreorder_traversal(root):ifnotroot:return[]stack=[root]result=[]whilestack:node=stack.pop()result.append(node.val)# 先压右再压左,保证左子树先出栈ifnode.right:stack.append(node.right)ifnode.left:stack.append(node.left)returnresult

2.后序遍历(左 → 右 → 根)非递归实现

后序遍历较复杂,因为根节点必须在左右子树都访问完之后才能输出。常用方法是“双栈法”或“标记法”。这里介绍简洁高效的双栈法
思路

  • 第一个栈用于遍历,顺序为:根 → 左 → 右(类似前序);
  • 将访问的节点按此顺序压入第二个栈;
  • 最终从第二个栈弹出时,顺序变为:根 ← 右 ← 左,即后序的逆序。
defpostorder_traversal(root):ifnotroot:return[]stack1=[root]# 主栈,用于遍历stack2=[]# 辅助栈,记录逆序结果whilestack1:node=stack1.pop()stack2.append(node)# 先压左再压右,保证右子树先处理ifnode.left:stack1.append(node.left)ifnode.right:stack1.append(node.right)# 弹出辅助栈得到后序序列result=[]whilestack2:result.append(stack2.pop().val)returnresult

💡 提示:也可以用单栈+指针标记已访问子树的方式实现,但双栈更直观易懂。


总结对比

遍历方式访问顺序栈操作特点
前序根 → 左 → 右直接弹出访问,先压右后压左
中序左 → 根 → 右一路向左入栈,为空则弹出访问并转向右
后序左 → 右 → 根使用双栈,模拟反向输出

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/29 18:13:02

YOLOv8 Cannot find module 错误修复指南

YOLOv8 Cannot find module 错误修复指南 在部署 YOLOv8 模型时,你是否曾遇到这样的报错: ModuleNotFoundError: No module named ultralytics明明已经拉取了官方镜像、启动了容器,为什么连最基本的 from ultralytics import YOLO 都无法执行…

作者头像 李华
网站建设 2026/3/18 23:33:15

YOLOv8模型版本管理:Git Tag发布规范说明

YOLOv8模型版本管理:Git Tag发布规范说明 在现代深度学习项目中,尤其是像YOLOv8这样迭代频繁、应用场景复杂的模型开发过程中,一个常见的困扰是:“我们上周训练的那个性能最好的模型,到底用的是哪份代码?用…

作者头像 李华
网站建设 2026/3/22 17:25:08

论文 AI 率到底怎么降?别再乱改了

一、为什么手动降重总翻车?学术党必知的3大痛点“明明查重率达标了,导师却说论文有AI味要求重写!”——这是不是你的真实写照?很多同学误以为同义词替换调整句式就能蒙混过关,结果陷入三大困局:❌ 痛点1&am…

作者头像 李华
网站建设 2026/3/31 9:16:10

论文降 AI 率的正确思路,比改词重要

一、为什么手动降重总翻车?学术党必知的3大痛点“明明查重率达标了,导师却说论文有AI味要求重写!”——这是不是你的真实写照?很多同学误以为同义词替换调整句式就能蒙混过关,结果陷入三大困局:❌ 痛点1&am…

作者头像 李华
网站建设 2026/3/29 2:16:10

YOLOv8在低光照条件下的表现优化策略

YOLOv8在低光照条件下的表现优化策略 在城市夜间监控、无人巡检设备和车载夜视系统中,我们常常面临一个共性难题:光线不足导致图像质量严重退化。画面里的人影模糊不清,车辆轮廓难以分辨,甚至连最基本的检测框都难以稳定输出。这种…

作者头像 李华
网站建设 2026/3/26 8:22:47

YOLOv8单元测试编写规范与执行方法

YOLOv8单元测试编写规范与执行方法 在现代AI工程实践中,模型训练和推理只是整个开发流程的一环。真正决定项目能否稳定落地的,是背后那套看不见却至关重要的质量保障体系——其中,单元测试正是关键的第一道防线。 以YOLOv8为例,作…

作者头像 李华