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

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.dtcms.com/a/302616.html

相关文章:

  • kruscal重构树
  • 【Spring Boot 快速开发】一、入门
  • React 服务器端渲染原理
  • 基于AFLFast的fuzz自动化漏洞挖掘(2)
  • 结合项目阐述 设计模式:单例、工厂、观察者、代理
  • 面向对象设计原则和设计模式分类
  • RTC时钟详解
  • 【智慧物联网平台】安装部署教程——仙盟创梦IDE
  • GitLab 公共仓库:coding 用到的 git 命令
  • PhpStorm + PHP8.1 + XDebug3 实现断点调试(亲测可用)
  • gitlab 在线合并分支a-分支b,解决冲突后,反向合并分支b-分支a
  • Vue 3 拖拽排序功能优化实现:从原理到实战应用
  • 8.1 ESP32CAM 服务器 网络摄像头
  • 本地大语言模型部署指南
  • TRIZ(5)——发明原理(3)
  • NVDB-CAVD 杯汽车信息安全系列赛事
  • 青少年编程中阶课
  • 【昆泰Chrontel CH7517A:DP转VGA】
  • Datawhale AI夏令营——列车信息智能问答——科大讯飞AI大赛(基于结构化数据的用户意图理解和知识问答挑战赛)
  • 在App Store Connect上编辑多个用户的访问权限
  • 医疗人工智能高质量数据集和语料库建设路径探析
  • 开始记录一步步学习pcl
  • Rust 最短路径、Tide、Partial、Yew、Leptos、数独实践案例
  • SpringCloud01——项目演变、微服务远程调用三种方式、springcloud介绍、nacos注册中心
  • 嵌入式开发学习———Linux环境下数据结构学习(四)
  • openlayer根据不同的状态显示不同的图层颜色
  • Java项目接口权限校验的灵活实现
  • AI学习之Cursor项目实战
  • ICPC 2024 网络赛(I)
  • 【大模型LLM】梯度累积(Gradient Accumulation)原理详解