二叉树前序中序后序遍历(非递归)

大家好,又和大家见面啦!今天我们一起去看一下二叉树的前序中序后序的遍历,相信这个对大家来说是信手拈来,但是,今天我们并不是使用常见的递归方式来解题,我们采用迭代方式解答。我们先看第一道前序遍历 

1、前序遍历

二叉树的前序遍历

前序遍历是先将二叉树的根节点遍历,再遍历左子树、右子树。我们做这道题的思想是把二叉树划分为两部分,一是左路节点,二是左路节点的右子树。什么是左路节点,如上图的二叉树来说,

这就算以8为根节点的二叉树的左路节点,也就是以8为根节点,它的左孩子的左孩子的左孩子......这一条路径。我们先让左路节点入栈,因为是前序遍历,所以我们入栈的同时,遍历当前结点的val,当左路结点都入栈完,那么当前节点一定是没有左子树的,我们让这个结点出栈,这个时候我们处理当前结点的右子树,右子树同样进行先让左路节点入栈.....循环做此操作,直到右子树也会空,然后将这个结点的所有左右子树我们都访问完成,我们已经pop掉这个时候,只需要处理新的栈顶元素就可以啦。

话不多说,思路就是这个样子,下面把代码写出来让大家看看。

定义一个cur从根节点开始,然后定义一个栈存储左路结点,一个vector存储左路节点的数据。

vector<int> preorderTraversal(TreeNode* root) {stack<TreeNode*> st;vector<int> v;TreeNode* cur=root;//cur从根节点开始while(cur){while(cur){v.push_back(cur->val);st.push(cur);//左路结点入栈cur=cur->left;}//处理栈内的右子树TreeNode* top=st.top();st.pop();cur=top->right;//处理左路节点的右子树}return v;}

代码写起来很简单,但是我们会发现这个提交是过不了的,为什么呢?大家看,我们在把1的右节点赋给cur去处理1的右子树时,结点1是没有右结点的,这个时候cur为空,上面这个大循环就进不去,而这个时候,我们其它的左路节点都还在栈里面没有处理,所以,外面这个大循环的判断条件是不正确的。应该改成

while(cur||!st.empty())

当栈不为空的时候,我们也要处理。 然后我们再运行,就可以通过了。

2、中序遍历

二叉树的中序遍历

我们还是拿这棵树来看,其实中序和前序思路是完全一样,只不过前序的遍历顺序是根左右,我们左路结点入栈的时候就可以直接访问其val,但是中序遍历的顺序是左根右,所以我们写中序的时候应该把访问val的顺序调到结点出栈的时候访问就可啦。

下面我们开始实现

vector<int> inorderTraversal(TreeNode* root) {stack<TreeNode*> st;vector<int> v;TreeNode* cur=root;while(cur||!st.empty()){while(cur)//左路结点进栈{st.push(cur);cur=cur->left;}TreeNode* top=st.top();v.push_back(top->val);st.pop();cur=top->right;//处理当前结点的右子树}return v;}

3、后序遍历

二叉树的后序遍历

后序遍历的遍历顺序是左右根,我们只有把左右结点全部访问完成才能访问根节点的数据,或者左右节点为空才能直接访问根节点的数据。左节点我们在左路子树入栈的时候就算是访问,但是右节点怎么解决呢?

所以说,我们这里需要解决一下,怎么才能知道右节点已经访问过了。我们以这里的结点6为例,要访问结点6的val,首先,我们把8,3,1入栈,结点1没有右子树,可以直接获取它的val,出栈后,栈顶元素是3,3有右子树,需要先处理它的右树,,然后6,4入栈,这时栈顶结点为4,4没有右树,直接获取它的val,此时栈顶元素为6,6他有右树,需要先处理他的右树,此时结点7入栈,这个时候7没有右树,直接获取它的val,这个时候结点6的左右树都访问完毕,可以访问6的val了,但是我们怎么判断结点6的左右树都已经访问完毕了呢?结点6上一次访问的结点是7,我们只需要判断,6结点的上一次访问的结点是不是7就可以了。

我们可以定义一个结点prev,每访问完一个栈顶元素,我们就把top赋给prev,表示上一个访问结点,我们只需要判断top->right==prev,即我们已经访问过top->right这个结点就行了,这样我们可以直接获取栈顶的val值。

因此,只有在当前结点的右树为空,或者当前结点的右结点是我们上一次访问的结点,我们就可以获取它的val值。

下面我们开始写代码

vector<int> postorderTraversal(TreeNode* root) {stack<TreeNode*> st;vector<int> v;TreeNode* cur=root;TreeNode* prev=nullptr;while(cur||!st.empty()){while(cur){st.push(cur);cur=cur->left;}TreeNode* top=st.top();//分情况讨论,如果当前这个结点的右子树为空,或者当前结点的右子树是我们上次访问的结点;表示我们已经访问过它的子树,就可以直接获取当前结点的valif(top->right==nullptr||top->right==prev){st.pop();v.push_back(top->val);prev=top;}//否者,访问这个结点的右树else{cur=top->right;}}return v;

到这里,二叉树的前序中序后序三个非递归方式就讲解完毕啦。我们下次再见呀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/473393.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

把Activity当做dialog对话框使用

1、引言 在安卓开发中对话框的使用是不可避免的&#xff0c;但是原生的对话框用起来总感觉差点意思&#xff0c;而且位置不好控制&#xff0c;在与界面的交互上也不够灵活&#xff0c;没有像activity那样的生命周期方法&#xff0c;以至于某些特殊的功能无法实现。此时我们就希…

MySQL 基础知识(八)之用户权限管理

目录 1 MySQL 权限管理概念 2 用户管理 2.1 创建用户 2.2 查看当前登录用户 2.3 修改用户名 2.4 删除用户 3 授予权限 3.1 授予用户管理员权限 3.2 授予用户数据库权限 3.3 授予用户表权限 3.4 授予用户列权限 4 查询权限 5 回收权限 1 MySQL 权限管理概念 关于 M…

太以假乱真了,大家小心

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

「算法」滑动窗口

前言 算法需要多刷题积累经验&#xff0c;所以我行文重心在于分析解题思路&#xff0c;理论知识部分会相对简略一些 正文 滑动窗口属于双指针&#xff0c;这两个指针是同向前行&#xff0c;它们所夹的区间就称为“窗口” 啥时候用滑动窗口&#xff1f; 题目涉及到“子序列…

数据结构之时空复杂度

一、前言 1&#xff09;什么是数据结构 数据结构(Data Structure)是计算机存储、组织数据的方式&#xff0c;指相互之间存在一种或多种特定关系的数据元素的 集合。 2&#xff09;什么是算法 算法(Algorithm):就是定义良好的计算过程&#xff0c;他取一个或一组的值为输入&am…

开年炸裂-Sora/Gemini

最新人工智能消息 谷歌的新 Gemini 模型 支持多达 1M的Token&#xff0c;可以分析长达一小时的视频 1M Token可能意味着分析700,000 个单词、 30,000 行代码或11 小时的音频、总结、改写和引用内容。 Comment&#xff1a;google公司有夸大的传统&#xff0c;所以真实效果需要上…

EXTI外部中断

&#xff1f; 难点&#xff1a;中断向量表、看门狗、NVIC的优先级位&#xff1f;EXTI框图&#xff1f; ------------------------ 中断系统 中断&#xff1a;在主程序运行过程中&#xff0c;出现了特定的中断触发条件&#xff08;中断源&#xff09;--->例如&#xff1a;…

TOP100 图论

1.200. 岛屿数量 给你一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。 岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外&#xff0c;你可以…

手把手一起开发SV4E-I3C设备(一)

1、SV4E-I3C设备介绍 SV4E-I3C 是Introspect Technology基于 13C 的设备接口开发、测试和编程的全套解决方案。该设备集三种仪器于一身&#xff0c;可用作协议练习器、协议分析器和通用 I3C 器件编程器&#xff0c;设备实物图片如图所示&#xff1a; SV4E-I3C设备的物理连接如…

C#,二进制数的非0位数统计(Bits Count)的算法与源代码

计算一个十进制数的二进制表示有多少位1&#xff1f; 1 遍历法&#xff08;递归或非递归&#xff09; 使用循环按位统计1的个数。 2 哈希查表法 利用一个数组或哈希生成一张表&#xff0c;存储不同二进制编码对应的值为1的二进制位数&#xff0c;那么在使用时&#xff0c;只…

element-UI 组件 dialog 中 ref 获取不到元素

项目场景&#xff1a; vue3集成bpmn.js 渲染过程中&#xff0c;进行流程图查看 问题描述 dialog弹窗加载获取canvas中 加载不到&#xff0c;导致偶尔流程展示加载失败 原因分析&#xff1a; 提示&#xff1a;官方解释如下&#xff0c;主要就是获取的时候&#xff0c;组件没有…

智胜未来,新时代IT技术人风口攻略-第四版(弃稿)

文章目录 前言鸿蒙生态科普调研人员画像高校助力鸿蒙高校鸿蒙课程开设占比教研力量并非唯一原因 企业布局规划全盘接纳仍需一段时间企业对鸿蒙的一些诉求 机构入场红利机构鸿蒙课程开设占比机构对鸿蒙的一些诉求 鸿蒙实际体验高校用户群体高度认同与影响体验企业用户群体未来可…