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

Day22-二叉树的迭代遍历

昨天学习了递归遍历:递归就是一次次的把参数压入栈中,然后返回的时候还是上一次递归保存的参数。

今天学习迭代遍历。

迭代遍历就是用栈去模拟保存二叉树的节点,然后依次去遍历,只不过要注意栈的后入先出的规则。

前序遍历:前序遍历的顺序应该是中左右,每次先处理中间节点,先把中间节点放入栈中,然后只要栈不为空就再调用一个指针去遍历二叉树,不过这个时候要注意:要先存放右节点,再存放左节点。

顺序应该是:12453 

迭代过程

  1. 栈初始化为 [1] → 弹出 1,记录 1,压入 3, 2(栈变为 [3, 2])。

  2. 弹出 2,记录 2,压入 5, 4(栈变为 [3, 5, 4])。

  3. 弹出 4,记录 4(无子节点,栈变为 [3, 5])。

  4. 弹出 5,记录 5(无子节点,栈变为 [3])。

  5. 弹出 3,记录 3(无子节点,栈为空)

代码实现:

class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {vector<int> result;stack<TreeNode*> st;TreeNode* cur = root;while (cur != NULL || !st.empty()) {if (cur != NULL) { // 指针来访问节点,访问到最底层st.push(cur); // 将访问的节点放进栈cur = cur->left; // 左} else {cur = st.top(); // 从栈⾥弹出的数据,就是要处理的数据(放进result数组⾥的数据)st.pop();result.push_back(cur->val); // 中cur = cur->right; // 右}}return result;}
};

中序遍历:

这个不能直接修改前序遍历的代码:

迭代思路

  1. 从根开始一路向左,把经过的节点全部压栈(不访问)。

  2. 弹出栈顶,访问它(这就是“根”)。

  3. 转向它的右子树,重复步骤1

class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {vector<int> result;stack<TreeNode*> st;TreeNode* cur = root;while (cur != NULL || !st.empty()) {if (cur != NULL) { // 指针来访问节点,访问到最底层st.push(cur); // 将访问的节点放进栈cur = cur->left; // 左} else {cur = st.top(); // 从栈⾥弹出的数据,就是要处理的数据(放进result数组⾥的数据)st.pop();result.push_back(cur->val); // 中cur = cur->right; // 右}}return result;}
};

后序遍历:

这个和前序遍历基本上一样,只不过最后翻转一下数组就好了。

http://www.xdnf.cn/news/16561.html

相关文章:

  • NAS远程访问新解法:OMV与cpolar的技术协同价值
  • 浏览器安全演进:从裸指针到 raw_ptr 的实践与思考
  • QGIS基于规则的道路分级制图及Leaflet集成展示实例
  • 日志分析-windows日志分析base--笔记ing
  • 数论1.01
  • 【实时Linux实战系列】在实时应用中进行负载均衡
  • Python day27
  • 【硬件】LVGL
  • 时序数据基座升维:Apache IoTDB 以“端边云AI一体化”重构工业智能决策
  • Java 大视界 -- 基于 Java 的大数据实时流处理在智能电网分布式能源接入与电网稳定性保障中的应用(368)
  • 基于黑马教程——微服务架构解析(二)
  • OpenI x SCNet “智能超算”创新应用挑战赛:实践阶段1和阶段2 部署Deepseek推理模型
  • 图片格式转换
  • AR技术赋能工业设备维护:效率与智能的飞跃
  • 【数据结构初阶】--二叉树(三)
  • 使用signal信号机制 + backtrace函数打印出程序崩溃后的堆栈信息
  • Flutter在购物场景中BLoC的应用
  • MySQL面试题及详细答案 155道(001-020)
  • 无人机气动设计模块解析
  • 微信小程序点击输入框时,顶部导航栏被遮挡问题如何解决?
  • 秩为1的矩阵的特征和性质
  • 【数据库】时序数据库选型指南:从大数据视角看IoTDB的核心优势
  • <PLC><西门子><modbusTCP>在西门子S7-1200系列PLC中,如何设置modbusTCP通讯?
  • 语音识别指标计算 WER
  • Java-泛型类的定义与使用
  • 24. 了解过 webp 吗
  • 如何进行DAP-seq的数据挖掘,筛选验证位点
  • Django 视图详解(View):处理请求与返回响应的核心
  • CenterOS8.5三台机器配置互信
  • 图解MySQL-小林code笔记