news 2026/5/25 21:24:27

【二叉树】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/5/25 19:28:32

46、System V 共享内存详解

System V 共享内存详解 1. 资源映射(Resource Maps) 在进程间通信(IPC)的三种机制中,消息队列和信号量使用了一种名为资源映射(Resource Maps)的底层内核内存分配方案。资源映射的作用是,从预先分配好的大量内核页面池中,对小块内核内存进行分配和释放操作。 消息队…

作者头像 李华
网站建设 2026/5/24 2:01:13

47、System V共享内存与信号量深入解析

System V共享内存与信号量深入解析 1. System V共享内存 1.1 映射结构差异 不同处理器的实际映射结构有所不同。UltraSPARC(SPARC V9)处理器实现了转换表(Translation Tables),由转换表项(TTEs)组成;SuperSPARC(SPARC V8)系统则实现了页表(Page Tables),包含页表…

作者头像 李华
网站建设 2026/5/26 4:50:23

49、POSIX IPC 全面解析

POSIX IPC 全面解析 1. POSIX IPC 概述 POSIX IPC(Inter-Process Communication)是一系列行业标准接口,提供了与 System V IPC 类似的功能,包括共享内存、信号量和消息队列。虽然在形式和功能上与 System V IPC 相似,但实现方式却大不相同。 POSIX IPC 基于 POSIX IPC …

作者头像 李华
网站建设 2026/5/26 2:14:25

60、Unix文件系统(UFS)全解析

Unix文件系统(UFS)全解析 1. UFS概述 Unix文件系统(UFS)是随Solaris系统一起发布的通用磁盘文件系统。自SunOS 4.x早期版本以来,它一直是标准的基于磁盘的文件系统。在Solaris的发展历程中,UFS经历了大量的变革,以满足应用程序对性能、安全性和可靠性的要求。 2. UFS…

作者头像 李华
网站建设 2026/5/25 2:54:02

63、深入解析影响文件系统性能的分页参数及相关缓存机制

深入解析影响文件系统性能的分页参数及相关缓存机制 1. 启用优先级分页时虚拟内存系统的表现 当启用优先级分页时,虚拟内存系统会呈现出不同的行为。使用相同的测试程序对文件系统进行随机读取,会引发系统分页,页面扫描器会积极参与页面管理,且此时扫描器仅释放文件页面。…

作者头像 李华
网站建设 2026/5/24 23:29:59

12、Linux系统下Snort的配置与使用指南

Linux系统下Snort的配置与使用指南 1. 安装Snort 在Linux系统上安装Snort的过程与Windows系统非常相似。主要区别在于, snort.conf 文件中的默认(相对)路径在Linux系统上更有可能无需修改即可使用。你需要下载适合你系统的最新版本的Snort。如果你使用的是Fedora Core 5…

作者头像 李华