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

【前序、中序、后序遍历递归栈的实现】

前序、中序、后序遍历递归&栈的实现

  • 递归实现
    • 前序遍历
    • 中序遍历
    • 后序遍历
  • 栈实现
    • 前序遍历
    • 中序遍历
    • 后序遍历

特性DFS(深度优先搜索)BFS(广度优先搜索)
遍历顺序深度优先,沿着树的深度遍历,直到叶子节点再回溯。广度优先,按层次从上到下、从左到右遍历。
实现方式递归或栈队列
空间复杂度O(h),h 为树的高度(递归栈的深度)。O(w),w 为树的最大宽度(队列的大小)。
时间复杂度O(n),n 为树的节点数。O(n),n 为树的节点数。
遍历结果示例前序:1 2 4 5 3 6
中序:4 2 5 1 3 6
后序:4 5 2 6 3 1
层序:1 2 3 4 5 6
  		1/ \2   3/ \   \4   5   6

递归实现

前序遍历

根节点 -> 左子树 -> 右子树

def pre_order_traversal(root):if root is None:returnprint(root.val)  # 访问根节点pre_order_traversal(root.left)  # 递归遍历左子树pre_order_traversal(root.right)  # 递归遍历右子树

中序遍历

左子树 -> 根节点 -> 右子树

def in_order_traversal(root):if root is None:returnin_order_traversal(root.left)  # 递归遍历左子树print(root.val)  # 访问根节点in_order_traversal(root.right)  # 递归遍历右子树

后序遍历

左子树 -> 右子树 -> 根节点

def post_order_traversal(root):if root is None:returnpost_order_traversal(root.left)  # 递归遍历左子树post_order_traversal(root.right)  # 递归遍历右子树print(root.val)  # 访问根节点

栈实现

前序遍历

前序遍历的顺序是:根-> 左 -> 右 (由上往下)
栈:根压入;根弹出;右、左压入;左、右弹出;
弹出顺序为:根-> 左 -> 右

def preorder_traversal(root):if not root:return []stack, result = [root], []while stack:node = stack.pop()result.append(node.val)# 先压右子树,再压左子树,保证左子树先出栈if node.right:stack.append(node.right)if node.left:stack.append(node.left)return result

中序遍历

前序遍历的顺序是:左 -> 根-> 右 (由下往上)
栈:最左的根压入;根弹出;右压入;右弹出; (最左的根:既是左,又是根)
弹出顺序为:左 -> 根-> 右

      1/ \2   3\4(1)1/ \2   3(2)
def inorder_traversal(root):stack, result = [], []current = rootwhile current or stack:# 先遍历到最左节点while current:stack.append(current)current = current.left# 弹出栈顶元素并访问current = stack.pop()result.append(current.val)# 遍历右子树current = current.rightreturn result

后序遍历

前序遍历的顺序是:左 -> 右 -> 根 (由下往上)
栈:根压入;根弹出;左、右、压入;右、左弹出;
弹出顺序为:根 -> 右 -> 左 所以需要在反转

def postorder_traversal(root):if not root:return []stack, result = [root], []while stack:node = stack.pop()result.append(node.val)# 先压左子树,再压右子树,保证右子树先出栈if node.left:stack.append(node.left)if node.right:stack.append(node.right)# 最后反转结果,得到后序遍历return result[::-1]

http://www.mrgr.cn/news/82610.html

相关文章:

  • SPSS实现中介效应与调节效应
  • F.interpolate函数
  • ts是什么、tsc是什么、tsx是什么、jsx是什么、scss是什么
  • SpringBoot3-深入理解自动配置类的原理(尚硅谷SpringBoot3-雷神)
  • 每日一题 380. O(1) 时间插入、删除和获取随机元素
  • 面试场景题系列:设计搜索自动补全系统
  • 计算机组成原理期末复习
  • 基于STM32环境温湿度监测系统设计(附项目代码zip)
  • Android Studio学习笔记
  • SpringBoot入门之创建一个Hello World项目
  • 服务器信息整理:用途、操作系统安装日期、设备序列化、IP、MAC地址、BIOS时间、系统
  • 【动态重建】时间高斯分层的长体积视频
  • 期末速成C++【大题汇总完】
  • 【蓝桥杯研究生组】第14届Java试题答案整理
  • DES密码的安全性分析(简化版本)
  • MySQL 08 章——聚合函数
  • 算法题(25):只出现一次的数字(三)
  • CSP初赛知识学习计划(第一天)
  • Spring Boot 3 实现 MySQL 主从数据库之间的数据同步
  • React Native 项目 Error: EMFILE: too many open files, watch
  • 密码学精简版
  • 06-C++类和对象强化
  • RSA密码的安全性分析(简化版本)
  • WandB使用笔记
  • C++ 中 Unicode 字符串的宽度
  • 《learn_the_architecture_-_aarch64_exception_model》学习笔记