面试经典(13)--二叉树非递归遍历

虚拟机VirtualBox下载与安装、安装Ubuntu超详细图文步骤,对一些配置问题也有所写。 自己使用过两款虚拟机,相较于VMware虚拟机来说,virtuabox虚拟机所占内存更小,只有几十兆,且完全开源不收费,里面的功能与VMware基本差不多(在日常开发、学习使用完全够用)。最主要的是,在博主自己使用VMware时经常出错,而virtualbox就更稳定一些,所以这篇是针对virtualbox的安装与一些细节部分。 阅读详情

1.中序遍历

中序遍历的思路分析:第一次遍历到节点,要一直遍历到此节点左子树上最左侧的节点,此过程将遍历到的节点按先后顺序依次入栈。到大最左侧时,将栈顶元素出栈并输出,并将此节点的右子树入栈,然后再从头开始,是不是明显看到递归的影子了!

代码如下:

stack<Node*> s;
void InOrder(Node *pRoot)
{
	if(pRoot==NULL)
	{
		return;
	}
	Node *p=pRoot;
	s.push(p);
	while(!s.empty())
	{
		p=s.top();
		while(p)
		{
			p=p->m_pLeft;
			s.push(p);	
		}
		s.pop();
		if(!s.empty())
		{
			Node *p=s.top();
			s.pop();
		    cout<<p->m_chValue<<" ";
		    s.push(p->m_pRight);
		}
	}
}

注意:上面代码19行处if(!s.empty)这条判断语句是不能省略的。因为当栈为空的时候,输出节点会出错。具体分析为什么要加这个判定语句,从代码看,while(不为空)进入循环,在进入if()判定之前有一个pop动作,所以这有可能使栈为空,是什么情况呢?就是在访问中序遍历的最后一个节点时(”最右“节点)。中序遍历访问的最后一个节点是“最右"节点(即它的右子树肯定为空,如果它的右子树非空,那么遍历会进入右子树,那么就不是最后访问的节点)。这个”最右"元素Node *p=top(),s.pop()出栈并输出。然后s.push(p->m_Right)(p->m_Right为空),所以NULL入栈。接下来进入while循环,栈中只有一个NULL,所以弹出NULL之后栈为空,如果不做判定直接输出会报错。分析这个过程的最简单的例子是分析一棵只有一个节点的树(这个节点就是”最右"节点)来体会上述分析过程。

2.后续遍历

后续遍历的非递归方式是最复杂的。要保证根节点在左右子树访问之后访问,对于任何一个节点p,先将其入栈,如果p没有左右子树,直接出栈访问,或者有左/右子树,但是已经访问过了,同样可以出栈并访问。如果不是这俩种情况,我们先将右子树入栈,再将左子树入栈,这样保证了先访问左子树,在访问右子树,最后访问根节点。

这里的关键是怎么确定当前节点cur的左右子树是否应经访问,可以使用pre指向当前节点cur前一个访问的节点,如果pre=cur->left(没有右子树)或者pre=cur->right(有右子树),则表明cur的左右子树已经访问。

代码:

void PostOrder(Node *pRoot)
{
	Node *cur,*pre=NULL;
	if(pRoot==NULL)
	{
		return;
	}
	s.push(pRoot);
	while(!s.empty())
	{
		cur=s.top();
		//当前节点没有左右子树或者左右子树应经访问过
		if((cur->m_pLeft==NULL && cur->m_pRight==NULL)||(pre!=NULL&&(pre==cur->m_pLeft||pre==cur->m_pRight)))
		{
			s.pop();
			cout<<cur->m_chValue<<" ";
			pre=cur;
		}
		else
		{
			if(cur->m_pRight)
				s.push(cur->m_pRight);
			if(cur->m_pLeft)
				s.push(cur->m_pLeft);
		}
	}
}

3.前序遍历非递归

思路分析:

如果看懂了上面的后续遍历,相信会很快写出前序遍历。前序遍历会先遍历根节点,然后遍历左、右子树。我们将栈顶元素出栈并输出,如果根节点有左右子树,然后将右子树先入栈,再将左子树入栈。

代码如下:

void PreOrder(Node *pRoot)
{
	if(pRoot==NULL)
	{
		return;
	}
	s.push(pRoot);
	while(!s.empty())
	{
		Node *p=s.top();
		cout<<p->m_chValue<<" ";
		s.pop();
		if(p->m_pRight)
			s.push(p->m_pRight);
		if(p->m_pLeft)
			s.push(p->m_pLeft);
	}
}



参考:http://www.cnblogs.com/dolphin0520/archive/2011/08/25/2153720.html

从Safety Manual到系统安全概念 本文系统阐述了构建功能安全"证据链"的工程化方法论,核心要点包括:1)建立"风险→对策→验证→证据"闭环链条;2)SafetyManual和FMEDA作为关键证据支撑点,前者界定系统安全边界,后者量化诊断覆盖率;3)通过四步法继承芯片安全机制并扩展至系统级;4)形成"设计-分析-验证"三维闭环体系,包括安全目标、技术实现和验证矩阵;5)强调证据链闭环对安全认证和OEM认可的重要性。该方法论实现了从理论要求到工程实践的完整转化,确保安全设计可验证、可 阅读详情

相关推荐

深信服桌面云实战:从零部署到高效运维的关键配置指南

本文提供了一份深信服桌面云从零部署到高效运维的实战指南。内容涵盖项目启动阶段的资源、网络与存储规划,详细演示了VMP与VDC平台的安装与对接,并深入讲解了制作虚拟机模板、配置用户体系、优化终端策略等核心步骤。最后,分享了包括CPU公平分配、智能调度在内的关键性能调优与高阶运维技巧,旨在帮助管理员构建稳定、高效的云桌面环境。

blockchain9miner的博客 451

二叉树的非递归遍历

二叉树的非递归遍历 二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。 ​ 三种遍历方式访问节点的顺序是一致的,不同之处在于,有的遍历流程把访问到的节点暂存起来,达成某种条件后再将节点输出。

qq_43169752的博客 1万+

基于MacOS本地部署OpenClaw+Ollama技术要点

本文基于MacOS系统下本地部署OpenClaw+Ollama的实操经验,梳理部署全流程中的核心技术要点、环境配置规范、故障排查方法及落地优化方案,聚焦“本地AI模型联动OpenClaw技能调度”的核心需求,为同类本地部署场景提供可复用的技术参考,规避常见部署风险,确保系统稳定运行。

在科技赋能新时代,共同探索基础理论和宇宙未知。 5162

GetWindow、GetTopWindow和GetNextWindow

GetWindow  //uCmd 可选值:GW_HWNDFIRST = 0; {同级别第一个}GW_HWNDLAST = 1; {同级别最后一个}GW_HWNDNEXT = 2; {同级别下一个}GW_HWNDPREV = 3; {同级别上一个}GW_OWNER = 4; {属主窗口}GW_CHILD = 5; {子窗口}       函

7980

三轴云台稳定控制算法优化实战:从PID到模糊自适应

本文深入探讨了三轴云台稳定控制算法的优化实践,从经典PID控制到模糊自适应算法的进阶应用。通过实战案例和代码示例,详细解析了PID调参技巧、模糊控制实现及多传感器数据融合方法,帮助工程师在复杂环境下提升云台抗干扰能力和响应速度,特别适用于无人机航拍等场景。

green的博客 908

基于混合智能框架的景区边界范围预测与补全系统

摘要 本文提出一种混合智能框架,结合随机森林模型和GIS规则约束,解决景区边界缺失问题。系统基于Python和ArcGIS平台,利用多源地理空间数据训练随机森林分类器预测景区范围,并集成地形、水文、道路等GIS规则进行优化。实验结果表明,该方法能有效预测15000个景区的边界,精度优于单一模型。创新点在于: 1)数据驱动与知识驱动相结合的混合智能范式; 2)面向全国尺度的大规模边界补全; 3)提供完整的Python+ArcGIS实现方案。该系统为景区精细化管理提供了技术支撑,具有实用价值。

huanghm88的专栏 281

面试题-二叉树遍历(非递归实现)

一、题目 要求使用非递归的方法,分别实现前、中、后序遍历二叉树。 二、分析 如果使用递归的方法,我们很简单就能实现二叉树的遍历,简单实现一个前序遍历二叉树的例子。 public void recursivePreTree(TreeNode tree) { if (tree == null) { return; } System.out.printl...

248

web渗透学习手册

依据多年的渗透测试项目经验及个人理解,对漏洞分类

渗透之路,攻防之间皆学问 1万+

算法 (十三)二叉树:遍历二叉树(递归和非递归版)

1、遍历二叉树(递归和非递归版)

PizAn的博客 425

多天线技术:5G波束成形&空间复用&空时编码

以提升信号的可靠性。然而,在20世纪90年代中期,研究者们惊讶地发现,多天线技术不仅仅提供分集增益,还可以开启一些单天线系统无法实现的新机遇。,我们可以将信道矩阵 ( H ) 视为一个满秩矩阵,则理论上可以建立min(𝑁𝑇,𝑁𝑅)个独立的数据流,形成一个。波束成形是5G物理层的核心技术,其本质是利用多个天线来增强特定方向上的信号,同时抑制干扰方向的信号。:物理波束成形 = 🔦 类似手电筒的聚焦光束,虚拟波束成形 = 🌊 类似水波的相干叠加。随着 5G 和 6G 时代的到来,多天线技术的作用愈发重

weixin_43199439的博客 1389

华为自研 ERP、Oracle EBS 与 SAP 上线时系统配置思路设计差异深度分析

本文对比分析了华为自研ERP、Oracle EBS和SAP S/4HANA三大ERP系统在上线配置思路上的核心差异。从架构设计看,华为采用分布式微服务架构,SAP采用分层服务架构,Oracle采用集中式一体化架构;在模块配置上,华为以业务场景为导向,SAP基于行业模板,Oracle强调模块独立性;数据迁移方面,华为侧重业务规则清洗,SAP注重数据质量监控,Oracle依赖标准化工具;流程适配上,华为系统随流程调整,SAP在框架内优化,Oracle需定制开发;定制开发模式差异明显,华为采用插件化扩展,SAP使

金牌架构师 1450

数据结构——二叉树的非递归遍历

二叉树的非递归遍历,主要难点在于后序遍历。当出栈结点同时具有左右子树时需要判别遍历路经,确定是否已遍历右子树,遍历过右子树后再遍历根结点。

qq_42106610的博客 2310

深度剖析XY2-100与SL2-100协议:解锁激光打标核心技术密码

XY2-100和SL2-100是激光打标领域的两种核心控制协议。XY2-100协议采用串行通信,指令集简单,适合常规打标任务,具有成本优势;SL2-100协议支持更高速率(1Mbps以上),具备曲线插补等高级指令,在精密加工领域表现突出。两者的主要差异体现在数据传输(帧结构、速率)、指令集(功能、数量)、参数调节(范围、精度)和错误处理机制等方面。实际应用中,XY2-100适合简单图形的大批量生产,SL2-100更胜任复杂曲面的高精度加工。选择时需综合考虑打标需求、设备兼容性和成本因素,未来两种协议将持续优

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 957

(Java)二叉树的三种遍历(非递归实现)

将上述过程画图说明,便于理解:参考代码:public class Solution {public IList PreorderTraversal(TreeNode root) {List list = new ArrayList();Stack s = new Stack();if(root==null){return list;}TreeNode cur = root;s.push(cur);while(!s.empty()){cur = s.pop();while(cur!=null){lis

F1520080的博客 1219

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

代码训练营第13天| 二叉树理论基础 递归遍历 非递归遍历(迭代) 二叉树的层序遍历

int val;要学会写基本数据结构的定义,手写出来,不要出错,面试时可能会让这个一套手写出来。

maiyunzhang的博客 975

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

二叉树的遍历(包括递归和非递归方法),springboot启动原理面试

由于细节内容实在太多了,为了不影响文章的观赏性,只截出了一部分知识点大致的介绍一下,每个小节点里面都有更细化的内容!小编准备了一份Java进阶学习路线图(Xmind)以及来年金三银四必备的一份《Java面试必备指南》由于细节内容实在太多了,为了不影响文章的观赏性,只截出了一部分知识点大致的介绍一下,每个小节点里面都有更细化的内容![外链图片转存中…(img-uHHhqcNi-1711167473425)]小编准备了一份Java进阶学习路线图(Xmind)以及来年金三银四必备的一份《Java面试必备指南》

m0_60388419的博客 652

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

二叉树的遍历(包括递归和非递归方法)

注意:根节点是最先被压入第一个栈中的,同时也是最先被压入第二个栈中的!中序时,我们首先去遍历二叉树的左分支,并将节点压入栈中,只到找到最左边的叶节点,接着弹出(并打印节点),并看其有没右分支,如果没有,栈再弹出一个节点(根节点),看其有没有右分支。我们将树的每个节点压入栈中,由于是先序遍历,首先压入的是根节点,然后弹出(弹出节点时打印信息,且一个循环弹出一个节点),接着是压入右子树节点,最后压入左子树节点。isEmpty(s)) //在栈不为空的情况下,左孩子为空,弹出该结点,遍历右孩子。

H1767410的博客 939

【数据结构】二叉树 — 经典OJ面试题剖析!!!

二叉树的基本知识可以查看上一篇博客【数据结构】二叉树 — 图文并茂,带你领略它的魅力!!!二叉树所有题都是围绕着遍历进行的。任何一个二叉树,递归的时候一定是先递归到最左边的。 给你两棵二叉树的根节点p和q编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。给定一个二叉树,判断它是否是高度平衡的二叉树。平衡二叉树:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1 

小黑屋的黑小子的博客 1183

二叉树的三种非递归遍历方式(附C、java源码)

面试是跳槽涨薪最直接有效的方式,马上金九银十来了,各位做好面试造飞机,工作拧螺丝的准备了吗?掌握了这些知识点,面试时在候选人中又可以夺目不少,暴击9999点。机会都是留给有准备的人,只有充足的准备,才可能让自己可以在候选人中脱颖而出。《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!的人,只有充足的准备,才可能让自己可以在候选人中脱颖而出。[外链图片转存中…(img-przfAopn-1713461920130)]

2401_84003977的博客 617

JavaScript实现二叉树前中后序遍历

技术是没有终点的,也是学不完的,最重要的是活着、不秃。零基础入门的时候看书还是看视频,我觉得成年人,何必做选择题呢,两个都要。喜欢看书就看书,喜欢看视频就看视频。最重要的是在自学的过程中,一定不要眼高手低,要实战,把学到的技术投入到项目当中,解决问题,之后进一步锤炼自己的技术。技术学到手后,就要开始准备面试了,找工作的时候一定要好好准备简历,毕竟简历是找工作的敲门砖,还有就是要多做面试题,复习巩固。有需要面试题资料的朋友点击这里可以领取。F.jpg" />

2401_84091628的博客 861

二叉树的前中后序遍历-----非递归迭代实现 面试冲冲冲!!!

目录 一、二叉树的前中后序遍历概念 (一)前序遍历 (二)中序遍历 (三)后序遍历 (四)层序遍历 二、二叉树前序遍历 (一)题目描述 (二)思路 (三)程序实现 三、二叉树中序遍历 (一)题目描述 (二)思路 (三)程序实现 四、二叉树后序遍历 (一)题目描述 (二)思路 (三)程序实现 以下是整理了一晚上的二叉树三种非递归遍历方式,关于非递归遍历,有一个大的特点就是代码简单,但是难以理解。面试中常常考察我们的非递归迭代实现,而主要以后序遍历为重点!! 一、.

qq_41219243的博客 320

JavaScript实现二叉树前中后序遍历,面试几个月还没找到工作

/ 结点是空的,直接返回if (!

m0_57473261的博客 965

【算法总结】你真的掌握了二叉树的遍历嘛

最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的14套腾讯、字节跳动、阿里、百度等2021最新面试真题解析,我把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节。网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!多细节。

2401_84010457的博客 797

【算法总结】你真的掌握了二叉树的遍历嘛(1)

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从哪里入手去学习,对此我整理了一些资料如果你熟练掌握以下列出的知识点,相信将会大大增加你通过前两轮技术面试的几率!这些内容都供大家参考,互相学习。①「Android面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!轮技术面试的几率!这些内容都供大家参考,互相学习。

2301_82101470的博客 837

二叉树的遍历方式(1)

一般像这样的大企业都有好几轮面试,所以自己一定要花点时间去收集整理一下公司的背景,公司的企业文化,俗话说「知己知彼百战不殆」,不要盲目的去面试,还有很多人关心怎么去跟HR谈薪资。这边给大家一个建议,如果你的理想薪资是30K,你完全可以跟HR谈33~35K,而不是一下子就把自己的底牌暴露了出来,不过肯定不能说的这么直接,比如原来你的公司是25K,你可以跟HR讲原来的薪资是多少,你们这边能给到我的是多少?你说我这边希望可以有一个20%涨薪。

F1520080的博客 777
上一篇: 面试经典(14)--二叉树镜像
下一篇: 面试经典(12)--射击打靶问题
OS技术解密
博客等级 码龄16年 3760粉丝 189原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值