实现二叉树的前序/中序/后序非递归遍历——题集(十一)

二叉树的非递归前序、中序、后序遍历算法详解及代码实现(C语言) 转载请注明出处:https://blog.youkuaiyun.com/Benja_K/article/details/88389039 二叉树的非递归前、中、后序遍历算法详解及代码实现(C语言) 1. 前序遍历和中序遍历非递归算法思路 前序和中序非递归遍历的C代码 2. 后序遍历非递归算法思路 后序非递归遍历的C代码 1. 前序遍历和中序遍历非递归算法思路 遍历过程:(如图所示) 图1 前... 阅读详情

非递归实现二叉树的前序/中序/后序遍历——题集(十一)

       今天分享一下非递归实现二叉树的前序/中序/后序遍历,以及用不含头结点的单链表存储集合A和B,求解集合A与B的差集,并将结果保存在集合A的单链表中。。

       实现二叉树的前序/中序/后序非递归遍历的源代码和运行示例。

源代码如下:

#include<iostream>
using namespace std;
#include<stack>
 
//二叉树的前序/中序/后序非递归遍历
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x)
:val(x)
,left(NULL)
,right(NULL)
{
    }
};
 
//前序非递归遍历
void PreTraNR(TreeNode* root){//借助栈
cout<<"前序非递归遍历: ";
if(root==NULL){
cout<<endl;
return;
}
TreeNode* cur=root;
stack<TreeNode*> tmp;
tmp.push(cur);
 
while(!tmp.empty()){
cur=tmp.top();
 
while(cur->left != NULL){
cout<<cur->val<<" ";
cur=cur->left;
tmp.push(cur);
}
cout<<cur->val<<" ";
 
while(cur->right==NULL){
tmp.pop();
if(tmp.empty()){
cout<<endl;
return;
}
cur=tmp.top();
}
tmp.pop();
cur=cur->right;
tmp.push(cur);
}
 
cout<<endl;
return;
}
 
//中序非递归遍历
void OrdTraNR(TreeNode* root){//借助栈
cout<<"中序非递归遍历: ";
if(root==NULL){
cout<<endl;
return;
}
TreeNode* cur=root;
stack<TreeNode*> tmp;
tmp.push(cur);
 
while(!tmp.empty()){
cur=tmp.top();
 
while(cur->left != NULL){
cur=cur->left;
tmp.push(cur);
}
 
cout<<cur->val<<" ";
 
while(cur->right==NULL){
tmp.pop();
if(tmp.empty()){
cout<<endl;
return;
}
cur=tmp.top();
cout<<cur->val<<" ";
}
tmp.pop();
cur=cur->right;
tmp.push(cur);
}
 
cout<<endl;
return;
}
 
//后序非递归遍历
void PostTraNR(TreeNode* root){//借助栈
cout<<"后序非递归遍历: ";
if(root==NULL){
cout<<endl;
return;
}
TreeNode* cur=root;
TreeNode* prev=NULL;
stack<TreeNode*> tmp;
tmp.push(cur);
 
while(!tmp.empty()){
cur=tmp.top();
 
while(cur->left != NULL){
//prev=cur;
cur=cur->left;
tmp.push(cur);
}
 
while(cur->right == prev || cur->right==NULL){
cout<<cur->val<<" ";
prev=cur;
tmp.pop();
if(tmp.empty()){
cout<<endl;
return;
}
cur=tmp.top();
}
cur=cur->right;
tmp.push(cur);
}
 
cout<<endl;
return;
}
 
void TestTree()//二叉树的前序/中序/后序非递归遍历
{
cout<<"二叉树的前序/中序/后序非递归遍历"<<endl<<endl;
TreeNode * pRoot1=new TreeNode(1);
TreeNode * pRoot2=new TreeNode(2);
TreeNode * pRoot3=new TreeNode(3);
TreeNode * pRoot4=new TreeNode(4);
TreeNode * pRoot5=new TreeNode(5);
TreeNode * pRoot6=new TreeNode(6);
TreeNode * pRoot7=new TreeNode(7);
TreeNode * pRoot8=new TreeNode(8);
TreeNode * pRoot9=new TreeNode(9);
 
pRoot1->left = pRoot2;
pRoot1->right = pRoot3;
pRoot2->left = pRoot4;
pRoot2->right = pRoot5;
pRoot3->left = pRoot6;
pRoot3->right = pRoot7;
pRoot4->left = pRoot8;
PreTraNR(pRoot1);//前序非递归遍历
OrdTraNR(pRoot1);//中序非递归遍历
 
PostTraNR(pRoot1);//后序非递归遍历
}
 
int main(){
TestTree();//二叉树的前序/中序/后序非递归遍历
 
system("pause");
return 0;
}

运行结果:

 

       已知集合A和B的元素分别用不含头结点的单链表存储,函数difference()用于求解集合A与B的差集,并将结果保存在集合A的单链表中。例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成计算后A={10,20,30}。

      链表结点的结构类型定义如下:

struct node
{
int elem;
node* next;
};

       用不含头结点的单链表存储集合A和B,求解集合A与B的差集,并将结果保存在集合A的单链表中。其函数void difference(node** LA , node* LB)的源代码和运行示例。

源代码如下:

#include<iostream>
using namespace std;

//用不含头结点的单链表存储集合A和B,求解集合A与B的差集,并将结果保存在集合A的单链表中。
struct ListNode{
	int val;
	ListNode* next;
	ListNode(int _val)
	:val(_val)
	,next(NULL)
	{}
};

void  DifSet(ListNode** LA, ListNode* LB ){
	if(LB == NULL || LA == NULL) return;

	ListNode* cur=*LA;
	while(LB){
		cur=*LA;
		ListNode* prev=NULL;
		while(cur){
			if(cur->val == LB->val){
				if(prev)
					prev->next=cur->next;
				else
					*LA=cur->next;
				delete cur;
				break;
			}
			prev=cur;
			cur=cur->next;
		}
		LB=LB->next;
	}

	return;
}

void TestSet(){//求解集合A与B的差集
	ListNode * lA1=new ListNode(1);
	ListNode * lA2=new ListNode(2);
	ListNode * lA3=new ListNode(3);
	ListNode * lA4=new ListNode(4);
	ListNode * lA5=new ListNode(5);
	ListNode * lA6=new ListNode(6);
	ListNode * lA7=new ListNode(7);
	ListNode * lA8=new ListNode(8);

	lA1->next = lA2;
	lA2->next = lA3;
	lA3->next = lA4;
	lA4->next = lA5;
	lA5->next = lA6;
	lA6->next = lA7;
	lA7->next = lA8;

	ListNode * lB1 = new ListNode(1);
	ListNode * lB2 = new ListNode(4);
	ListNode * lB3 = new ListNode(6);
	ListNode * lB4 = new ListNode(8);
	ListNode * lB5 = new ListNode(11);
	
	lB1->next = lB2;
	lB2->next = lB3;
	lB3->next = lB4;
	lB4->next = lB5;

	cout<<"求解不含头结点的单链表存储集合lA1与lB1的差集,"<<endl<<"并将结果保存在集合lA1的单链表中"<<endl<<endl;
	cout<<"打印集合lA1: ";
	Printf(lA1);
	cout<<"打印集合lB1: ";
	Printf(lB1);
	DifSet( &lA1, lB1);
	cout<<"DifSet( &lA1, lB1)->打印集合lA1与lB1的差集结果; ";
	Printf(lA1);
}

int main(){
	TestSet();//求解集合A与B的差集
	
	system("pause");
	return 0;
}

运行结果:

 

       分享如上,如有错误,望斧正!愿大家学得开心,共同进步!

二叉树前序、中序、后序遍历非递归写法的透彻解析 前言 在前两篇文章二叉树和二叉搜索树中已经涉及到了二叉树的三种遍历。递归写法,只要理解思想,几行代码。可是非递归写法却很不容易。这里特地总结下,透彻解析它们的非递归写法。其中,中序遍历的非递归写法最简单,后序遍历最难。我们的讨论基础是这样的: 阅读详情

相关推荐

C++实现递归,非递归遍历二叉树(前序,中序,后序)

初学二叉树那会儿,始终掌握不好二叉树的遍历方法,更认为非递归遍历晦涩难懂没有掌握的意义。实际上非递归的遍历方法很有用处,由于每次递归都需要将函数的信息入栈,当递归层数太深很容易就导致栈溢出,所以这个时候就必须用到非递归遍历二叉树了。而且,当看懂非递归遍历后,你会发现,其实非递归也很简单。 我们知道,要想处理二叉树,离不开其遍历方式。遍历二叉树有三种方式,前序遍历,中序遍历,后序遍历,每种...

Hairy_Monsters的博客 4165

【二叉树初阶】前中后序遍历+层序遍历+基础习题

图解二叉树前序、中序、后序、层序遍历详解,以及基础习题解析,

weixin_46016019的博客 6734

C/C++ 二叉树的非递归遍历(前序、中序、后序非递归遍历)

二叉树的非递归遍历C/C++实现: 非递归先序遍历代码: void PreOrderTraversal (struct tree* root) { //非递归先序遍历 struct tree* temp = root; while (temp != NULL || S.top > 0) { while (temp != NULL) { ...

SanpTap的博客 2596

【二叉树】实现二叉树的前序、中序、后序的非递归遍历

二叉树的前序、中序、后序遍历的递归算法很好实现,这就不写了。非递归的实现肯定要借助栈来实现前序非递归的实现:根->左->右实现1、 借助栈的后进先出的思想,将根节点放入栈中,然后访问栈顶元素(根),然后将右孩子入栈,再将左孩子入栈,由于栈是后进先出,所以先出栈的是左孩子,这样就实现了先访问根,再访问左孩子,最后访问右孩子。void PreOreder_Nor(Node* pRoot) {

菜鸟成长记 765

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

文章目录一、什么是二叉树?二、二叉树的基本概念三、二叉树的三种遍历方式1.前序遍历(preordertraversal)1.中序遍历(inordertraversal)1.后序遍历(postordertraversal)四、代码实现1.建树过程2.递归写法3.非递归写法4.完整代码 一、什么是二叉树? 二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。

m0_62021646的博客 2199

二叉树三种遍历(前序,中序,后序)的递归与非递归C++实现

二叉树的前序遍历(递归实现): class Solution { public: vector<int> res; vector<int> preorderTraversal(TreeNode* root) { if(root!=NULL){ res.push_back(root->val); ...

SanfordZhu的博客 3546

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

看代码一目了然。 C++代码:#include <iostream> #include <stack> #include <queue> using namespace std;//二叉树节点 typedef struct BitNode{ char data; BitNode *lchild; BitNode *rchild; }BitNode, *BiTree;//按先

u011954296的博客 8362

二叉树的基本操作,包括前序、中序、后序遍历的递归和非递归算法

二叉树的基本操作,包括前序、中序、后序遍历的递归和非递归算法,不得不下的资源

手撕二叉树遍历(前序 + 中序 + 后序 递归 + 非递归 代码实现 + 例题)

文章目录前引二叉树遍历介绍1、二叉树前序遍历1、二叉树前序遍历代码(递归)2、二叉树前序遍历代码(非递归)2、二叉树中序遍历1、二叉树中序遍历代码(递归)2、二叉树中序遍历代码(非递归)3、二叉树后序遍历1、二叉树后序遍历代码(递归)2、二叉树后序遍历代码(非递归)二叉树遍历例题 前引 刚刚才写完了手撕最小堆的博客 就想了 是不是也得写一下二叉树遍历呢 哈哈 因为前段时间才写过 而且那个时候理解花了很多时间 所以现在手撕了三个遍历 大概花了5分钟左右 力扣三道题 前中后序遍历也就一次性全部AC啦 把这

Love 6's Private Blog 1万+

数据结构c语言版建立二叉树,中序非递归遍历(实验报告)

编写程序,用先序递归的方法建立二叉树,建立二叉树后,用中序非递归方法遍历该二叉树,并输出遍历序列。

实验五、二叉树操作及应用.docx

程序代码给出了该二叉树的链式存储结构的建立、前序、中序、后序遍历的算法,同时也给出了查询“E”是否在二叉树里的代码。代码有三处错误,有标识,属于逻辑错误,对照书中的代码仔细分析后,请修改了在电脑里运行。 资源含有实验报告的编写,及选做题(编写二叉树的前序(或中序)的非递归遍历算法并进行测试)

《C++ 二叉树:前序、中序、后序遍历递归与非递归实现》

前序遍历、中序遍历、后序遍历的递归实现很简单,但是非递归迭代实现就有稍微有点难理解了。用了同一种思路,把树分为左路节点和左路节点的右子树,针对这三种遍历方式都适用。从根本上就是用循环模拟递归的过程。后序遍历相对前序和中序又稍微复杂,要考虑好访问节点的条件,避免死循环。多画图模拟迭代的过程更容易理解。

2202_75924820的博客 3034

星链V3的2048条波束与1Tbps:多波束相控阵的工程代价

低轨卫星通信的容量提升,核心在于多波束相控阵天线的空间复用能力。相控阵通过控制大量天线单元的相位,可在同一阵面同时形成多条独立指向的波束,从而在有限频谱内成倍提升系统容量。星链V3宣称的2048条波束与1 Tbps汇聚吞吐量,正是基于这一原理:更多波束意味着更高的频率复用系数和更灵活的资源调度。但工程实现并非免费午餐,数字背后是供电、散热、重量、发射成本及运维复杂度的急剧攀升。从用户侧看,更精细的波束也带来切换频繁、低仰角衰减等新挑战。本文从多波束相控阵的基础原理出发,拆解波束形成、频谱复用和动态调度的工程

weixin_33462167的博客 347

非递归实现二叉树的前序,中序,后序遍历打印

前言:前面这篇文章主要是用递归的思想写了一颗二叉树,其中包括前序建树;前序,中序,后序遍历打印,层序遍历(非递归);求高度;求节点数;求叶子节点数;求第k层结点树等;详情请看: 递归实现二叉树的前,中,后序打印在我们了解了最简单的递归遍历以后,现在来说说用栈辅助,非递归实现二叉树的前序,中序,后序遍历打印 一:非递归实现前序遍历打印 1. 前序遍历,访问的顺序为根->左->右; 2. 前

4927

从零到一:PrimeTime静态时序分析入门指南

本文详细介绍了PrimeTime静态时序分析(STA)的入门指南,从基础概念到实际应用全面覆盖。内容包括时序路径分类、PrimeTime环境搭建、时序约束设置与验证、时序分析与报告解读等核心内容,帮助工程师快速掌握STA技术,解决数字芯片设计中的时序收敛问题。

weixin_28730131的博客 268

Amos实战:如何用Bootstrap法检验中介效应?附完整操作步骤

本文详细介绍了如何使用Amos软件通过Bootstrap法检验中介效应,包括模型设定、参数配置和结果解读。Bootstrap方法因其不依赖正态分布假设、统计功效高等优势,成为中介效应分析的首选方法。文章提供了完整的操作步骤和实用建议,帮助研究者准确评估变量间的中介作用机制。

zz67890的博客 1442

【C++】二叉树的前序中序后序非递归实现

【C++】二叉树的前序中序后序非递归实现

weixin_60478154的博客 1504

rk3568 RGMII KSZ8795 MAC TO MAC

参考《Rockchip_Developer_Guide_Linux_MAC_TO_MAC_CN.pdf》

明天乌儿会歌唱 6494

二叉树的非递归遍历(前序中序后序非递归C语言)

前两天做数据结构实验,要求用非递归算法遍历二叉树。只知道用栈来储存数据,具体算法还不太清楚。经过两天的搜索,看到网上很多种解法,很多解法都是用C++来写的算法,一直找不到用C语言写的算法,所以就总结了一下,用C写出了一个遍历二叉树的三种非递归算法。 前序遍历 前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。 具体算法:先遍历左孩子,并输出。当左孩子遍历完后,取栈顶,找右孩子。此时循环还没有结...

sinat_43009982的博客 6万+

2023最新多文明策略手游《万国觉醒内购版》最新整理Linux商业手工服务端+安卓+详细搭建教程

2023最新多文明策略手游《万国觉醒内购版》最新整理Linux商业手工服务端+安卓+详细搭建教程。源码内置详细搭建教程,感兴趣可自行下载。

百创科技 1715

OpenHarmony RK3568 从 32 位切换到 64 位用户空间指南

修改了编译参数(如修复 Q5 后),但 ThinLTO 缓存中保留了旧参数编译的 bitcode。这是一种节省内存的设计(32 位指针占 4 字节 vs 64 位占 8 字节),但在某些场景下需要切换为纯 64 位。切换到 64 位用户空间后,CPU 全程运行在 AArch64 状态,不再需要 AArch32 兼容模式。内核本身已经是 64 位(aarch64),切换用户空间位数不影响内核。(32 位兼容层)在纯 64 位系统中不再需要,可以关闭以减小内核体积。这两个参数对 64 位编译毫无意义,配合。

程小二的博客 690

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

我们先让左路节点入栈,因为是前序遍历,所以我们入栈的同时,遍历当前结点的val,当左路结点都入栈完,那么当前节点一定是没有左子树的,我们让这个结点出栈,这个时候我们处理当前结点的右子树,右子树同样进行先让左路节点入栈.....循环做此操作,直到右子树也会空,然后将这个结点的所有左右子树我们都访问完成,我们已经pop掉这个时候,只需要处理新的栈顶元素就可以啦。今天我们一起去看一下二叉树的前序中序后序的遍历,相信这个对大家来说是信手拈来,但是,今天我们并不是使用常见的递归方式来解题,我们采用迭代方式解答。

weixin_67131528的博客 1433

华为OD机考2025C卷 - 精准核酸检测(Java & Python& JS & C++ & C语言)

华为OD机考2025C卷 - 精准核酸检测,提供在线OJ Java & Python& JS & C++ & C

算法大师! 2882

【二叉树Java】二叉树遍历前序中序后序遍历的非递归写法

二叉树遍历的非递归写法

liuwanqing233333的博客 3133

[AI] 本地部署 Dify 遇到 Internal Error?一文彻底解决密码不一致引发的问题

摘要:Dify本地部署常见InternalError错误主要由配置残留或密码不一致导致,特别是修改.env文件后未同步清除数据库记录。彻底解决方案包括:1)清理Docker数据;2)删除旧配置和数据库;3)还原源代码;4)重建.env文件;5)重新初始化部署。关键提醒:记录部署路径、备份.env文件并妥善保存密码。该错误本质是配置冲突,最有效方法是完全重置而非调试,保持清晰的部署管理可避免多数InternalError问题。(149字)

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 435

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

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

根据二叉树的前序和中序遍历结果还原二叉树、根据二叉树的中序和后序遍历结果还原二叉树

m0_55752775的博客 1876

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

上一篇: 判断一棵二叉树是否是平衡二叉树并求一颗二叉树的镜像——题集十
下一篇: 判断一个节点是否在一棵二叉树中和判断一颗二叉树是否是另一颗树的子树——题集(十二)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值