二叉树的各种遍历方法(非递归)

三种非递归遍历二叉树的方法    就以这个树为例,来讲讲二叉树的非递归遍历。 先序遍历: 先序遍历结果为3 4 6 5 8 9,就拿树的左枝为例,3是根,打印,4是3的左孩子,打印,6是4的左孩子,打印,6的左孩子为空,所以返回到4,然后去找4的右孩子,4的右孩子也为空,返回到3,这就是左子树遍历的过程。然后非递归主要用到栈来存储结点,栈先进后出,所以应该是右孩子先入栈,左孩子后入栈,这样pop就能先得到左孩子。先将根结点3入栈,接下来就是开始循环,循环结束的条件就是栈为空,先弹出栈顶,再打印栈顶,如果. 阅读详情
#include<malloc.h>
#include<iostream>
#include<stack>
#include<queue>
using namespace std;
typedef  char ElemType;
typedef struct  BtNode
{
	BtNode *leftchild;
	BtNode *rightchild;
	ElemType data;
}BtNode,*BinaryTree;

先序遍历(非递归)

非递归就是利用栈的特性(先进后出),来进行模拟栈

void NicePreOrder(BtNode *p)
{
	 BtNode *s = NULL;
	 stack<BtNode* > st;
	 st.push(p);
	 while(!st.empty())
	 {
		 BtNode *node = st.top();st.pop();
		 cout<<node->data<<" ";
		 if( node->rightchild != NULL)
		 {
			 st.push(node->rightchild);
			 if(node->leftchild != NULL)
			 {
                             st.push(node->leftchild);
			 }
		 }
	 }
	 cout<<endl;
}

中序遍历(非递归)

//中序遍历
void NiceMiOrder(BtNode *p)
{
	BtNode *s = NULL;
	stack<BtNode* > st;
	while(p != NULL || !st.empty())
	{
		while(p != NULL)
		{
			st.push(p);
			p = p->leftchild;	
		}
		BtNode *node = st.top();st.pop();
	    cout<<node->data<<" ";
	    p = node->rightchild;
	}
	cout<<endl;
}

后序遍历(非递归)

方法一:

//后序遍历
//后序遍历递归定义:先左子树,后右子树,再根节点。
//后序遍历的难点在于:需要判断上次访问的节点是位于左子树,还是右子树。
//若是位于左子树,则需跳过根节点,先进入右子树,再回头访问根节点;
//若是位于右子树,则直接访问根节点。
void NiceLaOrder(BtNode *p)
{
	BtNode *s = NULL;
	stack<BtNode *> st;
	BtNode *tag = NULL;
	while(p != NULL || !st.empty())
	{
		while(p != NULL)
		{
			st.push(p);
			p = p->leftchild;
		}
		BtNode *node = st.top();st.pop();
		if(node->rightchild == NULL || node->rightchild == tag)
		{
			cout<<node->data<<" ";
			tag = node;
			node = NULL;///////////////
		}
		else
		{
			st.push(node);
			p = node->rightchild;
		}
		
	}
	cout<<endl;
} 

方法二:

//要保证根结点在左孩子和右孩子访问之后才能访问,因此对于任一结点P,先将其入栈。
//如果P不存在左孩子和右孩子,则可以直接访问它;
//或者P存在左孩子或者右孩子,但是其左孩子和右孩子都已被访问过了,则同样可以直接访问该结点。
//若非上述两种情况,则将P的右孩子和左孩子依次入栈
//这样就保证了每次取栈顶元素的时候,左孩子在右孩子前面被访问
//左孩子和右孩子都在根结点前面被访问。
void nice_last_order(BtNode *ptr)
{
	stack<BtNode *>  st;
	st.push (ptr);
	BtNode *pre=NULL;
	while(!st.empty())
	{ 
		ptr=st.top();
		//如果当前节点没有左右孩子,或者有左孩子或有孩子,但已经被访问输出,  
        //则直接输出该节点,将其出栈,将其设为上一个访问的节点  
		if((ptr->leftchild==NULL && ptr->rightchild==NULL) 
			||( pre && (ptr->leftchild==pre  || ptr->rightchild==pre)))
		{
			printf("%c  ",ptr->data);
			pre=ptr;//让pre记录Ptr之前访问的结点
			st.pop();
		}
		else
		{
			if(ptr->rightchild!=NULL)
			{
				st.push (ptr->rightchild);
			}
			if(ptr->leftchild!=NULL)
			{
				st.push (ptr->leftchild);
			}
		}
	}
}

层次遍历(非递归)

//二叉树的层序遍历
//二叉树的层序遍历,由于其层级的关系,需要借助队列实现,从左到右,自上而下
//一次将二叉树的各个结点入队,这样便可以保证输出的顺序是层序排列的
void level_order(BtNode *ptr)
{
	queue<BtNode *>  qu;
	if(ptr==NULL)
	{
		return;
	}
	qu.push(ptr);
	while(!qu.empty())
	{	
		ptr=qu.front();
		printf("%c  ",ptr->data);
		qu.pop();
		if(ptr->leftchild!=NULL)
		{
			qu.push(ptr->leftchild);
		}
		if(ptr->rightchild!=NULL)
		{
			qu.push(ptr->rightchild);
		}
	}
}

黑群晖二合一已损毁_手动修复黑群晖已损毁磁盘空间 lz的用法是这样的,一个中古级mac mini 2011上装有vmware esxi 7.6, 然后上面挂载了lz的华芸Asustor Nas的iscsi空间,lz用的是basic volume,然后esxi上面有虚拟的黑群晖6.2.2-24922,黑群晖的docker里跑着不可描述软件,但是发现下载速度过快时,比如有好几个文件同时下载,总速度超过60MB/s以后storage manager里很... 阅读详情

相关推荐

2019美亚杯团体赛刷题 部分题解(1-42、106-116)

文章目录写在前面使用工具刷题1.在黑客路由器里,有一台设备的MAC地址为00:11:6B:47:4D:55,请问它的IP地址是什么?2.在黑客路由器里,发现一设备的IP地址为192.168.0.103,请问该设备为如下哪一个:3.警方已经查证所有连接此router的设备都归黑客所有,根據黑客路由器的訊息,下列哪组(设备---ip)是错误的:4.Hacker现场检获的Windows主机硬盘已成功取证并制作成镜像Win1.E01,下列哪个是其硬盘证据文件的MD5哈希值。5.MD5hash算法会产生一个什么大小的

7ruth0hn的博客 7545

二叉树的非递归遍历

二叉树的非递归遍历 二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用...

weixin_30518397的博客 486

Windows与Linux安装miniconda并启动python项目及指令

官方介绍:Miniconda 是 conda 的免费最小安装程序。它是 Anaconda 的一个小型引导版本,仅​​包含 conda、Python、它们都依赖的包以及少量其他有用的包(例如 pip、zlib 等)。如果您需要更多软件包,请使用该 命令从 Anaconda 公共存储库或其他渠道(例如 conda-forge 或 bioconda)默认提供的数千个软件包中进行安装。minicoda下载地址最好挂个梯子。如果你需要指定版本的conda,可以在这里下载历史版本的miniconda。

一直走的很慢的鸭子 3191

二叉树简单操作

(一)求二叉树的深度 如果一棵树只有一个结点,那么它的深度为1; 如果根结点只有左子树没有右子树,那么树的深度是左子树的深度加1,加1是加上根节点这一层 如果既有左子树又有右子树,那么树的深度应该是左、右子树中深度较大的值再加1 递归代码 int Depth1(BtNode* ptr) { if(ptr == NULL) return 0; int nleft = Depth1(p...

小不点的博客 269

【紫光同创PG2L200H开发板】盘古200Pro+开发板(MES2L676-200HP)

开发板 SMA接口符合标准 SMA 接口规范,可使用”内螺旋+插针“的 SMA 线连接板卡”外螺旋+插孔”的 SMA 接口进行通信,板卡 SMA 接口与 FPGA 的 HSST 收发器的一路 RX/TX 相连,TX信号和 RX 信号都是以差分信号方式通过隔直电容连接 FPGA 和 SMA 接口, TX 发送和 RX 接收数据速率高达 6.6Gb/s。为了减轻带电插拔造成对 FPGA 芯片的损坏,在设计上在 JTAG 信号位置添加了保护二极管来保证信号的电压在 FPGA 接受的范围,避免 FPGA 的损坏。

MYMINIEYE的博客 2883

BK3437蓝牙5.2芯片实战:手把手教你设计超低功耗智能家居遥控器(附原理图)

本文详细介绍了BK3437蓝牙5.2芯片在超低功耗智能家居遥控器设计中的应用。通过分析芯片的核心优势、硬件设计要点和低功耗固件策略,手把手教你实现日均功耗低于5μA的遥控器原型,并附有原理图设计详解和常见问题解决方案。

tgb34567890的博客 619

java使用递归,非递归方式实现二叉树的三种常见遍历方式

二叉树的定义: 二叉树(binary tree)是结点的有限集合,这个集合或者空,或者由一个根及两个互不相交的称为这个根的左子树或右子树构成. 从定义可以看出,二叉树包括:1.空树 2.只有一个根节点 3.只有左子树 4.只有右子树 5.左右子树都存在 有且仅有这5中表现形式  二叉树的特点: 性质1:在二叉树的第i层上至多有2^(i-1

奔跑的蜗牛的博客 1万+

推荐系统召回总结(持续更新)

推荐系统架构 候选池:可供推荐的物料候选池,对于图文、短视频、新闻等来说通常是最近N天的新物料组成的集合,定期进行物料更新。 召回:从候选池中选出和用户相关的物料,交给后面的排序模块进行打分。召回面对的候选集通常是数十万或者百万甚至千万的量级,检索过程必须轻量快速。通常由多路召回组成,保证不遗漏且相关性、多样性尽量好,可以分为非个性化召回和个性化召回。 粗排:对召回选择的几千或者几百候选物料进行排序,快速打分选出topN,减少精排的压力,兼顾精准与效率。 精排:对粗排的结果进行精准排序,这个环节需要特征尽可

whgyxy的博客 2515

c语言二叉树删除节点算法,二叉树删除节点的有关问题

该楼层疑似违规已被系统折叠隐藏此楼查看此楼以下是二叉树删除节点的代码,C Primer Plus 第5版中的第17章的原代码bool DeleteItem(const Item *pi,Tree *ptree){Pair look;look=SeekItem(pi,ptree);if(look.child==NULL)return false;if(look.parent==NULL) ...

weixin_34331737的博客 666

手把手教你完成基于matlab的路面裂缝检测系统设计

裂缝是路面病害最早的形态之一,只有在裂缝出现的早期进行维护,才能有效地提高公路的使用寿命。因此,路面裂缝的检测识别系统对于提升公路质量有着重大的意义。首先,对路面裂缝图像进行相应的预处理,目的是减小环境因素的影响,消除无用的噪点。然后提取目标图像特征,判断路面裂缝类型,标记出路面裂缝的位置。最后通过设计的 GUI 界面来集成各个关键步骤,显示所得到的试验结果。仿真结果表明,设计的路面裂缝检测识别系统是高效可行的。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1216

【Altium designer】BOM导出 Bill of Materials 如何自定义格式

【Altium designer】如何自定义BOM导出格式 我们用Excel做一个xx.xlt的2003的模版文件,取文件名为:AltiumDesiger PCB BOM Template.xlt 将AltiumDesiger PCB BOM Template.xlt文件存放在:AltiumDesiger 安装目录的Template文件夹内

夜半少年的博客 2717

数据结构——二叉树遍历和常见问题

二叉树遍历 二叉树常见问题

weixin_57133901的博客 3645

AISBench benchmark评测工具实操-精度评测场景-采用命令行指定模型和数据集的方式

搭建AISBench benchmark测试环境,包括创建conda环境、安装AISBench benchmark、处理ceval数据集,并修改相关配置文件以适配测试需求。最终,通过启动精度测评,验证了模型在指定环境下的性能。

m0_50105717的博客 2041

非递归先序遍历二叉树总结(3种方法)

算法 非递归先序遍历二叉树总结(3种方法) @author:Jingdai @date:2020.12.03 递归先序遍历二叉树非常的简单,但是面试的时候面试官经常会要求我们写非递归的方法,这里总结一下。 方法1 先写一个最简单的方法。首先回想一下层次遍历二叉树的代码,利用一个队列完成树的遍历。如下代码。 public static void levelOrderTraverse(TreeNode root) { if (root == null) return; Li

qq_41512783的博客 8008

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

非递归中序遍历二叉树总结(2种方法)

算法 非递归中序遍历二叉树总结(2种方法) @author:Jingdai @date:2020.12.03 方法1 先序遍历是第一次遇到该节点遍历;中序是第二次遇到该节点遍历;而后序是第三次遇到该节点遍历。非递归用栈进行遍历,第一次遇到就是压栈时,第二次是弹栈时,所以中序遍历应该弹栈的时候进行遍历。弹栈后代表弹栈节点及其左子树已经遍历完了,所以此时将弹栈节点的右子节点压栈,对其右子树进行同样的操作。代码如下。 public static void inOrderTraverse(TreeNode root

qq_41512783的博客 4464

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

非递归后序遍历二叉树总结(2种方法)

算法 非递归后序遍历二叉树总结(2种方法) @author:Jingdai @date:2020.12.04 传送门 非递归先序遍历二叉树 非递归中序遍历二叉树 方法1 非递归用栈来辅助遍历,后序遍历是第三次遇到该节点再遍历,但是栈只能给我们提供遇到两次的判断方法,第一次是入栈时,第二次是出栈时,它们分别对应着二叉树的先序和中序遍历。所以我们需要利用一些技巧来辅助我们判断,这也是后序遍历二叉树比先序和中序稍微复杂一点的原因。 看着代码进行分析。 public static void postOrde

qq_41512783的博客 7391

非递归遍历二叉树的方法

三种递归遍历对遍历的描述,思路非常简洁,最重要的是三种方法完全统一,大大减轻了我们理解的负担。而我们常接触到那三种非递归遍历方法,除了都使用栈,具体实现各有差异,导致了理解的模糊。本文给出了一种统一的三大非递归遍历的实现思想。 三种递归遍历 //前序遍历 void preorder(TreeNode *root, vectorint> &path) { if(root !=

Roykuang的专栏 475

非递归的方法遍历二叉树

//非递归遍历一棵树 需要借助栈 #include #include struct Tree { int nValue; Tree *pLeft; Tree *pRight; }; struct Stack { Tree *root; Stack *pNext; }; Stack *pStack = NULL; void push(Tree *root) { St

花火 1050

二叉树遍历的非递归方法

https://blog.youkuaiyun.com/qiuxinfa123/article/details/84880786 2.先序遍历。非递归先序遍历的思路如下: 1.先将根节点入栈 2.访问根节点 3.如果根节点存在右孩子,则将右孩子入栈 4.如果根节点存在左孩子,则将左孩子入栈(注意:一定是右孩子先入栈,然后左孩子入栈) 5.重复2-4 //先序遍历非递归 public void preO...

chun的博客 421

二叉树遍历的非递归实现方法

二叉树的遍历,通常分为前序、中序、后序和层序遍历。而前序、中序和后序遍历,我们一般刚开始接触的都是递归实现的方式,这种情况不再赘述,本文是主要介绍的是二叉树遍历的非递归实现方法。 首先,定义树节点的结构: class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x;

sunset108的专栏 789

非递归方法实现二叉树前、中、后序遍历

前序遍历中,找结点的右边要出栈找,维护出栈顺序,出栈的那一刻起,左边之前已经为空或者打印了,出栈取到结点找到右边,如果有结点新的结点会进栈,如果为空说明子树应该找完了,此时跟出栈的结点无关了。中序遍历只是打印的位置不一样,前序和中序遍历,要看结点的右边,需要出栈来查看,出栈的目的是,根和左已经找完了,只需要取出来找右边就可以了,右边找完根据栈返回上一级。3.右边为空时,打印栈顶的结点,弹出栈顶,cur为空,进入大循环,查看栈顶的右边,不为空,改变cur的指向。前序遍历的顺序是 :根——左——右。

WengJM的博客 1128

二叉树的建立、三种(递归、非递归)遍历方法

二叉树定义: 1.有且仅有一个特定的称之为根root的结点 2.当n>1时,除根结点之外的其余结点分为两个互不相交的子集。他们称为二叉树的左子树和右子树。 二叉树的一种建立方法: 若对有n个结点的完全二叉树进行顺序编号(1=1)的结点。 当i=1时,该结点为根,它无双亲结点; 当i>1时,该节点的双亲编号为[i/2]; 若2i 当2i+1 利用上个性质,对任意二叉树,先按满二叉树

尽人事,听天命 2230

二叉树的前序、中序和后序遍历(递归和非递归的方法)

二叉树的前序、中序和后序遍历(递归和非递归的方法) 二叉树的基础概念 二叉树: 是每个节点最多只有两个分支的树结构。通常分支被称为”左子树“和”右子树“。二叉树的分支具有左右次序,不能随意颠倒。 下图是一棵二叉树 二叉树还有如下的性质: 二叉树的第 iii 层至多有 2i−12^{i-1}2i−1 个节点 深度为 kkk 的二叉树至多有 2k−12^k-12k−1 个节点 一颗含有 nnn 个...

EngineerHe的博客 1万+

更简单的非递归遍历二叉树的方法

解决二叉树的很多问题的方案都是基于对二叉树的遍历。遍历二叉树的前序,中序,后序三大方法算是计算机科班学生必写代码了。其递归遍历是人人都能信手拈来,可是在手生时写出非递归遍历恐非易事。正因为并非易事,所以网上出现无数的介绍二叉树非递归遍历方法的文章。可是大家需要的真是那些非递归遍历代码和讲述吗?代码早在学数据结构时就看懂了,理解了,可为什么我们一而再再而三地忘记非递归遍历方法,却始终记住了递归遍历方

lipnpn的专栏 286

非递归方法遍历二叉树

[TOC] 前序遍历 思路: 前序遍历由图示是先一里路向左全递归压栈并且边压栈边打印,直到左指针为空,然后得到栈顶指针,并出栈,找该栈顶结点的右结点,如果不为空,同样的一路左递归压栈,边压栈边打印,直到左指针为空,然后重复,最后栈为空停止。 中序遍历 思路: 和前序遍历不一样的地方只是打印的地方不一样,一个是顺着一步一步入栈的时候打印,一个是出栈前打印,这样会导致结点数据和结点左指...

4559的博客 314

非递归方法中序遍历二叉树

typedef char BTreeData; // 二叉树的结点 typedef struct _btreeNode { BTreeData data; struct _btreeNode *lchild;   // 指向左孩子结点的指针 struct _btreeNode *rchild;   // 指向右孩子结点的指针 }BTreeNode;   // 二叉树 t

ying2541885998的博客 299
上一篇: 二叉树的所有遍历方法(递归)
下一篇: 数组和链式二叉树之间的转换,你知道吗?
玲max
博客等级 码龄9年 36粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值