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

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

本文主要总结二叉树的前序、中序、后序遍历,分为递归和非递归

(1)前序遍历:根→左→右

(2)中序遍历:左→根→右

(3)后序遍历:左→右→根

 

首先定义一个二叉树:

  1. struct BiTree 
  2. {  
  3.    char val;  
  4.     BiTree *lchild;  
  5.     BiTree *rchild;  
  6. };  

1.递归的方法

(1)前序遍历(根→左→右)

  1. void PreOrderTraverse(BiTree* root)  
  2. {  
  3.     if (root!=NULL)  
  4.     {  
  5.         cout<<root->val;
  6.         PreOrderTraverse(root->lchild);  
  7.         PreOrderTraverse(root->rchild);  
  8.     }     
  9. }  

(2)中序遍历(左→根→右)

  1. void InOrderTraverse(BiTree* root)  
  2. {  
  3.     if (root!=NULL)  
  4.     {  
  5.         InOrderTraverse(root->lchild);  
  6.         cout<<root->val;
  7.         InOrderTraverse(root->rchild);   
  8.     }     
  9. }  


(3)后序遍历(左→右→根)

  1. void PostOrderTraverse(BiTree* root)  
  2. {  
  3.     if (root!=NULL)  
  4.     {  
  5.         PostOrderTraverse(root->lchild);  
  6.         PostOrderTraverse(root->rchild);   
  7.         cout<<root->val;
  8.     }     
  9. }  


2.非递归遍历:用到了栈

(1)前序

  1. vector<int> preorderTraversal(TreeNode* root) {  
  2.     vector<int> res;  
  3.     std::stack<TreeNode*> temp;  
  4.     while (root || !temp.empty()) {  
  5.         while (root) {  
  6.             temp.push(root);  
  7.             res.push_back(root->val);  
  8.             root = root->left;  
  9.         }  
  10.         root = temp.top();  
  11.         temp.pop();  
  12.         root = root->right;  
  13.     }  
  14.     return res;  
  15. }  

(2)中序

  1. vector<int> inorderTraversal(TreeNode* root) {  
  2.     vector<int> res;  
  3.     std::stack<TreeNode*> temp;  
  4.     while (root || !temp.empty()) {  
  5.         while (root) {  
  6.             temp.push(root);  
  7.             root = root->left;  
  8.         }  
  9.         root = temp.top();  
  10.         temp.pop();  
  11.         res.push_back(root->val);  
  12.         root = root->right;  
  13.     }  
  14.     return res;  
  15. }  

(3)后序

  1. vector<int> postorderTraversal(TreeNode* root) {  
  2.     vector<int> res;  
  3.     std::stack<TreeNode*> temp;  
  4.     while (root || !temp.empty()) {  
  5.         while (root) {  
  6.             temp.push(root);  
  7.             res.insert(res.begin(),root->val);  
  8.             root = root->right;  
  9.         }  
  10.         root = temp.top();  
  11.         temp.pop();  
  12.         root = root->left;  
  13.     }  
  14.     return res;  
  15. }  

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

相关推荐

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

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

Hairy_Monsters的博客 4165

二叉树的各种遍历(先序、中序、后续、层次)——递归、非递归

package btree; import java.util.Queue; import java.util.Stack; import java.util.concurrent.LinkedBlockingQueue; public class Btree { /** * 结点类。 * @author Bao Yiming */ cla

森哥在奋斗 548

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

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

SanfordZhu的博客 3546

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

/*////////////////////////////////////////////////////////////////////////////// // 名 称 (Unit Name): BiTree.h 二叉树头文件 // 备

ZEROのSPACE 4019

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

m0_62021646的博客 2199

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

二叉树的遍历 常见的二叉树的遍历有三种方式:前序遍历(根节点,左子树,右子树)                                                    中序遍历(左子树,根节点,右子树)                                                    后序遍历(左子树,右子树,根节点) 每种方式都可以用递归和非递归来实现 ...

苍老的小孩的博客 8293

二叉树前序、中序以及后序遍历(递归展开图)

函数的实现很简单(因为前、中、后序的遍历函数可以说没有什么改变,只是顺序不一样),但是光看函数实现肯定不好理解,所以我们重点就在递归展开图,大家写递归的时候就可以画画图,可以更好理解(因为递归是一层一层的)我们创建一个树的结构体,然后实现开辟节点的函数,下面就要链接了(再写一个链接函数,这个函数调用开辟节点函数),开辟好之后就把各自链接起来,大家可以随意链接,我先给大家看看我的树,好方便后面观察递归展开图。大概就是递归进去,然后return或者结束返回,因为递归就是一层一层的。左子树 右子树 根。

SunYJ_的博客 1123

二叉树的后序遍历非递归算法

1. 对于树的遍历我们最常用的三种遍历方法分别是前序遍历、中序遍历和后序遍历,使用的方法是深度优先遍历树的每一个节点,这些遍历方法都是使用递归函数来进行实现的,在数据量大的情况下是比较低效的,原因在于系统帮助我们调用了一个栈并且做了诸如保护现场和恢复现场等复杂的操作,才使得遍历可以使用非常简单的代码来实现,所以我们可以模仿系统中调用的栈自己可以来写一下栈,模仿其中的过程就可以完成对于三种遍历算法的...

二哈 4万+

python 二叉树 前序中序后序层序 递归与非递归遍历

Python 二叉树的遍历 二叉树初始化 # Definition for a binary tree node. class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None #示例如何初始化一个二叉树 root = node(5) root.left = node(7) root.right = node(8) root.

Mario的博客 720

一文彻底搞定二叉树的前序、中序、后序遍历(图解递归非递归)

前言 大家好,我是bigsai,在数据结构与算法中,二叉树无论是考研、笔试都是非常高频的考点内容,在二叉树中,二叉树的遍历又是非常重要的知识点,今天给大家讲讲二叉树的层序遍历。 这部分很多人可能会但是需要注重一下细节。 前面介绍了二叉排序树的构造和基本方法的实现,遍历也是比较重要的一环,并且二叉树的层序遍历也是bfs的最简单情况,这里我就将二叉树的层序遍历以及常考问题给大家分享一下。 在了解二叉树的遍历之前,需要具备数据结构与算法有队列、递归、栈、二叉树,这些内容咱们前面都有讲过,有这方面知识欠缺的同学可以

bigsai 1万+

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

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

2202_75924820的博客 3032

Scipy优化踩坑实录:trust-constr和SLSQP约束定义到底差在哪?

本文深入解析了Scipy优化模块中trust-constr和SLSQP两种方法在约束定义上的差异。通过对比面向对象的trust-constr和字典式定义的SLSQP,揭示了它们各自的优势与适用场景,帮助开发者在有约束优化问题中选择合适的算法,提升计算效率与准确性。

weixin_42573113的博客 270

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

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

weixin_67131528的博客 1433

SCG到ECG信号转换:Wave U-Net模型实现移动端心脏监测

心脏监测技术中,心电图(ECG)和心脏振动信号(SCG)是两种重要的生物信号。ECG记录心脏电活动,而SCG捕捉机械振动,两者通过电-机械耦合机制关联。Wave U-Net模型通过编码器-解码器结构和扩张卷积,实现了SCG到ECG的高精度转换,参数量减少90%以上。这一技术在移动设备上达到临床可用精度,未来可通过手机实现专业级心电图监测。应用场景包括睡眠呼吸暂停监测、心脏再同步化治疗评估等,为移动医疗带来革新。

weixin_35649491的博客 301

SRAM:SRAM入门指南与工作原理

SRAM(Static Random Access Memory),即静态随机存取存储器,是一种能够读取和写入数据的内存(RAM)。它使用由晶体管组成的触发器来存储数据,只要有电源供应,数据就可以稳定地保存。与动态随机存取存储器(DRAM)不同,SRAM 不需要周期性地刷新来保持数据。

weixin_42896509的博客 1万+

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

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

m0_55752775的博客 1876

Brainstorm简单分析近红外数据(fNIRS)(一)

Brainstorm分析fNIRS数据

weixin_43604817的博客 1351

二叉树系列(2)前序中序后序遍历的递归和非递归实现

递归地对二叉树进行遍历的做法比较好理解。有一颗树,长成这个样子。 下面分别是对它进行三序遍历的结果: 前序递归 //前序递归 void pre_order(link t, void (*visit)(link)) { if(!t) return; visit(t); pre_order(t->l, visit); pre_order(t->r, visit); }

BUILD 2271

S参数反演法

等效介质理论模型— 利用S参数反演法提取超材料结构的等效参数 等效介质理论模型—利用S参数反演法提取超材料结构的等效参数 S参数反演法,即利用等效模型的传输矩阵和S参数求解超材料结构的等效折射率n和等效阻抗Z的过程。本文对等效介质理论模型进行了详细介绍,并提供对应代码。 超材料的传输矩阵 超材料结构的传输矩阵函数为: 其中,d 为等效光学活性材料的厚度,n 为折射率,Z 表示阻抗。 S参数和传输矩阵T 超材料结构的S参数和传输矩阵T满足下列方程: 利用以上两式,可以得到等效折射率n和相对阻抗的表达式

weixin_43962864的博客 1万+

脑肿瘤MRI图像分割实战:基于U-Net的深度学习完整指南

脑肿瘤是中枢神经系统最常见的疾病之一,全球每年有超过30万人被诊断为原发性脑肿瘤。在临床诊断和治疗过程中,磁共振成像(MRI)已成为评估脑肿瘤的标准影像学检查方法。然而,手动分割MRI图像中的肿瘤区域是一项耗时且依赖于专家经验的工作,不同医生之间可能存在显著差异。

YOLO 150

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

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

4927

《UDS协议从入门到精通》系列——图解0x85:控制DTC的设置

如何让ECU停止或恢复DTC状态位更新?有哪些注意点?图解+示例教你快速上手UDS 0x85服务!!

车载系统攻城狮 3862

二叉树的遍历;前序 中序 后序遍历二叉树;递归 非递归实现; 重建二叉树;编程之美重建二叉树

最近复习数据结构,重点看了下二叉树,这篇文章主要介绍下二叉树的遍历,包括中序遍历、前序遍历和后序遍历;同时利用二叉树的中序遍历和前序遍历或者后序遍历来重建一棵二叉树。 下面先给出对于某个节点的前序、中序、后序遍历的定义: 1、前序遍历: 先访问该节点,然后在递归遍历其左子树,然后再访问其右子树 2、中序遍历: 先递归遍历其左子树,然后访问该节点,然后再递归遍历其右子树 3、后序遍历: 先递归遍历其左子树,然后递归遍历其右子树,然后在访问该节点。   下面先说明如何实现二叉树的三种遍历,然后

疯狂算法~ 2万+

第十二天:Python字典(Dict)详解

字典(Dictionary)是Python中最强大的数据类型之一,它是一种可变的、无序的键值对(key-value)集合。字典中的元素是通过键(key)来存取的,而不是通过偏移量(如列表中的索引)。 字典的核心特性包括: 键值对结构:每个元素由一个键和一个值组成,中间用冒号(:)分隔 无序性:字典中的元素没有固定的顺序(Python 3.7+版本中字典会保持插入顺序,但不应依赖此特性进行顺序操作) 可变性:可以动态地添加、修改或删除键值对 键的唯一性:字典中的键必须是唯一的,如果重复,后面的键值对会覆盖

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1677

SAP B1中文培訓教材_SDK

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

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

二叉树遍历的非递归写法

liuwanqing233333的博客 3133

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

上一篇: 二叉树深度优先(DFS)和广度优先(BFS)算法的非递归实现
下一篇: 数组shuffle
code_caq
博客等级 码龄11年 112粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值