news 2026/9/3 2:26:48

【二叉树】DFS遍历的迭代理解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【二叉树】DFS遍历的迭代理解

我们知道,二叉树前中后序遍历的常见写法是递归,而递归的底层逻辑是栈,所以理论上来说,所有递归都能用栈来实现,只是复杂的递归用栈实现起来会很复杂
而这种简单的递归,不仅用栈实现不是很复杂,还涉及到了递归的底层逻辑的理解,是面试很喜欢的题目
现在和我一起走进它吧


如果我们想得到遍历结果,肯定是以某种顺序将节点压入栈中,以某种顺序弹出节点,而弹出节点的顺序就是遍历的结果(出栈的顺序就是遍历结果的顺序)
所以我们要解决的问题就是上方提到的两个某种顺序

先说结论:
前序遍历:结果需要以中左右弹出栈,所以 以中右左的顺序入栈
后序遍历:修改前序遍历的代码两处
中序遍历:用指针记录遍历顺序,到某种程度出栈


前序遍历:

我们知道前序遍历的顺序是中->左->右
举个例子:

5 / \ 4 6 / \ 1 2

遍历结果为54126
它具有一个特点:即时性(访问这个元素,就直接输出,再进行下一步)

class Solution { public: vector<int> preorderTraversal(TreeNode* root) { vector<int> res; stack<int> st; if(root==nullptr) return nullptr; st.push(root->val); while(root){ if(root->right) st.push(root->right->val); if(root->left) st.push(rott->left->val); } return res; } };

后序遍历:

后序遍历的顺序是左->右->中
所以从前序到后序只需要修改两步:中左右->中右左->左右中

  • 第一步:将左右的访问顺序对调
  • 第二步:将结果数组存储的结果倒序输出
class Solution { public: vector<int> postorderTraversal(TreeNode* root) { stack<TreeNode*> st; vector<int> v; if(root!=nullptr) st.push(root); while(!st.empty()){ TreeNode*topNode=st.top(); st.pop(); v.push_back(topNode->val); if(topNode->left!=nullptr){ st.push(topNode->left); } if(topNode->right!=nullptr){ st.push(topNode->right); } } reverse(v.begin(),v.end()); return v; } };

中序遍历:

后序遍历的顺序是左->中->右
它是特殊的,因为它与我上方说的即时性相反,具有延后性
(访问到这个元素,需要等到它的左子树访问到的时候,才能输出这个元素)
所以我们需要一个指针来记录遍历顺序,当左为空,就弹出该节点;右为空,说明是叶子结点,弹出该节点的父节点

class Solution { public: vector<int> inorderTraversal(TreeNode* root) { stack<TreeNode*> st; vector<int> v; TreeNode*p=root; while(p!=nullptr||!st.empty()){ if(p!=nullptr){ st.push(p); p=p->left; } else{ p=st.top(); st.pop(); v.push_back(p->val); p=p->right; } } return v; } };
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 21:21:24

51、Solaris 文件与文件 I/O 详解

Solaris 文件与文件 I/O 详解 1. Solaris 文件概述 Unix 系统从诞生起就围绕进程和文件这两个基本实体构建。在 Solaris 中,文件是存储字节数组数据的实体,数据形式多样,如文本文件、二进制可执行文件、目录文件等。Solaris 支持多种文件类型,部分文件类型在内核层面定义…

作者头像 李华
网站建设 2026/9/2 4:51:14

10、网络资源保护:从基础加固到数据加密

网络资源保护:从基础加固到数据加密 1. 扫描操作与敏感数据加密概述 在完成选择后,点击“下一步”,扫描将立即开始。快速扫描的速度极快,扫描完成后,你看到的下一个窗口便是扫描结果窗口。若工具检测到异常,系统会提示你决定后续操作。 保护敏感数据的另一种有效方式是…

作者头像 李华
网站建设 2026/9/2 19:14:20

15、事件日志管理与安全保障

事件日志管理与安全保障 自定义应用日志报告错误处理 在请求自定义应用(customapp)报告时可能会出现错误。当前目录下的 customapp.conf 文件会指定一个日志文件组,进而明确需要检查的日志文件。 /logfiles/ 目录包含日志文件组的配置文件,这些文件定义了哪些日志文件…

作者头像 李华
网站建设 2026/9/3 1:21:00

Liquid AI发布新一代混合模型LFM2,重新定义边缘AI部署标准

Liquid AI发布新一代混合模型LFM2&#xff0c;重新定义边缘AI部署标准 【免费下载链接】LFM2-700M-GGUF 项目地址: https://ai.gitcode.com/hf_mirrors/LiquidAI/LFM2-700M-GGUF 在人工智能模型向轻量化、本地化部署加速演进的当下&#xff0c;Liquid AI近日推出的新一…

作者头像 李华
网站建设 2026/9/2 12:48:49

百度文心4.5大模型部署全解析:GPU配置与性能优化指南

百度文心4.5大模型部署全解析&#xff1a;GPU配置与性能优化指南 【免费下载链接】ERNIE-4.5-300B-A47B-Base-PT 项目地址: https://ai.gitcode.com/hf_mirrors/baidu/ERNIE-4.5-300B-A47B-Base-PT 随着生成式AI技术的飞速发展&#xff0c;大语言模型的参数规模和能力边…

作者头像 李华
网站建设 2026/9/2 0:38:15

4、深入理解 Linux 网络基础与管理

深入理解 Linux 网络基础与管理 1. 主机解析顺序 在 Linux 系统中,主机解析顺序的最终确定依赖于 /etc/nsswitch.conf 文件。虽然 /etc/hosts 文件会首先被检查,但 /etc/nsswitch.conf 决定了主机解析的完整顺序。可以使用以下命令查看主机解析顺序: cat /etc/nss…

作者头像 李华