news 2026/4/23 13:26:52

【二叉树】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/4/23 12:10:08

53、Solaris文件系统I/O操作全解析

Solaris文件系统I/O操作全解析 1. 数据完整性和同步标志 Solaris提供了文件标志,用于设置不同级别的数据同步和文件完整性。这为读写文件的应用程序开发者提供了一定的灵活性,但随着完整性级别的提高,成本也会增加。 在 open 系统调用中可以设置三个适用的标志: O_SY…

作者头像 李华
网站建设 2026/4/22 11:37:22

59、文件系统路径名管理与Unix文件系统解析

文件系统路径名管理与Unix文件系统解析 1. 段映射(segmap)统计与操作 段映射(segmap)在文件系统中起着重要作用。从示例的segmap统计数据可知,在总共16,109,564次getmap调用中,有15,257,790次槽位被回收,文件和偏移的槽位重用率达到95%,即segmap中文件系统页面的缓存…

作者头像 李华
网站建设 2026/4/23 12:13:49

16、系统测试与审计:保障网络安全的关键步骤

系统测试与审计:保障网络安全的关键步骤 在当今数字化的时代,网络安全至关重要。为了确保网络系统的安全性和可靠性,对系统进行全面的测试和审计是必不可少的。本文将详细介绍系统测试和审计的相关内容,包括系统清单的建立、漏洞扫描、无线系统的定位以及重要文档的管理。…

作者头像 李华
网站建设 2026/4/16 13:20:02

17、网络安全文档管理与漏洞扫描工具全解析

网络安全文档管理与漏洞扫描工具全解析 在网络安全领域,保障信息安全是至关重要的。这不仅涉及到对各类安全文档的妥善管理,还需要借助有效的漏洞扫描工具来检测系统的安全状况。下面将详细介绍安全文档管理要点以及几款常见的漏洞扫描工具。 安全文档管理 安全文档主要分…

作者头像 李华
网站建设 2026/4/23 12:18:02

20、网络监控与故障排除工具全解析

网络监控与故障排除工具全解析 1. SNMP 版本差异 简单网络管理协议(SNMP)在发展过程中经历了多个版本的迭代,每个版本在功能和安全性上都有所不同。下面为你详细介绍各版本的特点: | 版本 | 功能特点 | 数据传输方式 | | ---- | ---- | ---- | | SNMP v1 | 仅包含基本…

作者头像 李华
网站建设 2026/4/18 13:55:02

23、保障网络安全的关键要素与实践

保障网络安全的关键要素与实践 在网络安全领域,保障网络的安全性是一个持续且复杂的过程,涉及多个关键要素和实践。以下将详细介绍这些方面,帮助你更好地维护网络安全。 角色与职责明确 在网络安全的各个领域,角色和职责的明确都至关重要,尤其是在漏洞扫描和修复工作中…

作者头像 李华