算法学习13:分别用递归和非递归方式实现二叉树先序、中序和后序遍历

二叉树的前中后序以及层序遍历(递归与非递归方法实现) 1.前序遍历 前序遍历是二叉树遍历的一种方式,也称做先序遍历。其遍历规则为:根节点→左子树→右子树。以下分别以递归和非递归的方法实现对二叉树的前序遍历。 1.1 递归方法 class Solution { List<Integer> res=new ArrayList<>(); public List<Integer> preorderTraversal(TreeNode root) { if(root!=null){ 阅读详情

数据结构

树结点

class Tree{
	public:
		int data;
		Tree* left;
		Tree* right;
		Tree(int x){this->data=x;left=NULL;right=NULL;}
};

构造一颗二叉树

Tree* head=new Tree(1);
head->left=new Tree(2);
head->right=new Tree(3);
head->left->left=new Tree(4);
head->left->right=new Tree(5);
head->right->left=new Tree(6);
head->right->right=new Tree(7);

二叉树遍历递归版

在二叉树的递归遍历中,每个节点都会被访问三次(第一次回到达某个节点,第二次为遍历完该节点的左数后返回,第三次为遍历完这个节点的右树返回)下面代码注释部分的123代表第123次到达该节点的时候。

public f(Tree* head){
//1
	if(head!=NULL){
		return;
	}
	//1
	f(head->left);
	//2
	//2
	f(head->right);
	//3
	//3
}

先序遍历就是先打印头结点的信息,再打印左节点和右节点。根据递归序加工就可以得到想要的访问次序。在第一次到达节点后,就打印信息。二三次时候不进行操作。
中序遍历就是先打印左树再打印头最后打印右树。利用递归序,第二次来到某个节点才打印,不是第二次不打印。
后序遍历就是先左树再右树最后头,递归序中第三次访问就是后序。
先序

void preOrderRecur (Tree* head){
	if(head!=NULL){
		return;
	}
	cout<<head->data;
	preOrderRecur(head->left);
	preOrderRecur(head->right);
}

中序和后序的代码同理省略。

非递归方法实现二叉树先序遍历
  1. 申请一个新栈,记为stack。然后将头结点head压入栈stack中。
  2. 从stack中弹出栈顶节点,记为cur,打印cur的值。再将cur的右节点压入栈中,再将cur的左节点压入栈中。
  3. 不断重复步骤2,直到stack为空,全部过程结束。
void preOrderRecur (Tree* head){
	stack<Tree*> t;
	t.push(head);
	while(!t.empty()){
		head=t.top();
		cout<<t.top()->data;
		t.pop();
		if(head->right!=NULL){
			t.push(head->right);
			}
		if(head->left!=NULL){
			t.push(head->left);
			}
	}
}
非递归实现二叉树后序遍历

分析:先序遍历的访问顺序是头左右,如果在压入堆栈的过程先压左再压右,那么此时的访问顺序就变为头右左,如果将要访问的数据推入一个新的栈中,就可以实现逆序访问,即左右头。

void preOrderUnRecur(Tree* head){
	stack<int> t;
	stack<int> t1;
	if(head!=NULL){
		t1.push(head);
	}
	while(!t.empty()){
		head=t.pop();
		t1.push(head);
		if(head->left!=NULL){
			t.push(head->left);
	}
		if(head->right!=NULL){
			t.push(head->right);
		}
	}
	while(!t1.empty()){
		cout<<t1.pop();
	}


}
非递归实现二叉树中序遍历

先将整颗树的左边界压入栈中,依次弹出的过程中打印,对弹出节点的右树的左边界压入栈中。

void inOrderUnRecur(Tree* head){
	if(head!=NULL){
		stack<int>s;
		s.push(head);
		while(!s.empty()||head!=NULL){
			if(head!=NULL){
				t.push(head);
				head=head->left;
			}else{
				head=t.pop();
				cout<<head->data;
				head=head->right;
			}
			
		}
	}
}
非递归实现二叉树的先序遍历,中序遍历,后序遍历 非递归实现二叉树的先序遍历,中序遍历,后序遍历 1. 二叉树先序遍历(非递归) 先序的遍历的访问顺序为先根节点,再左孩子,最后右孩子。 所以,根据栈后进先出的特点,应先入栈右孩子,再入栈左孩子。 先序遍历,借助栈实现 1根节点入栈 2判断栈顶元素是否为空 3访问栈顶元素,出栈 4栈顶元素的右孩子若不为空,入栈。栈顶元素的左孩子不为空,入栈。 5循环2-4 ... 阅读详情

相关推荐

cut&tag学习笔记

上图是我得到的结果,下图是教程的结果,比对结果有一些差异,我也不知道具体原因是啥。谷歌了一下,发现原因可能是因为环境变量的问题,系统不知道picard的具体位置,需要设置全局环境变量,遂查了一下picard的位置。我发现我做出来的结果测序深度一致,但是比对的结果有一点差异,不知道是我的操作问题,还是参考基因组更新了导致比对结果出现了些许不同。上图是我得到的结果,下图是教程的结果,除了IgG_rep1外比对结果一致。上图是我的结果,下图是教程的结果,结果不太一致,不知道是具体的原因是什么。

weixin_52073820的博客 2423

【考研数据结构代码题6】二叉树的遍历(递归与非递归实现)

2017年计算机学院初试题(二叉树层次遍历)及其拓展

人生处处是围城,一切都是最好的安排! 870

Python 驱动 CAD 二次开发:从零搭建自动化绘图环境

本文详细介绍了如何利用Python进行CAD二次开发,实现自动化绘图。通过win32com库建立Python与CAD软件的通信,文章从环境搭建、连接CAD、操作文档到核心绘图与批量处理,提供了完整的实战指南。该方法能显著提升机械设计、建筑绘图等领域的重复性工作效率,将创造力从繁琐劳动中解放出来。

weixin_29093169的博客 1230

递归和非递归方式实现二叉树的先序、中序和后序遍历

二叉树的递归实现和非递归实现、递归序

明朗晨光的专栏 2459

Lattice FPGA 开发工具Diamond使用流程总结——工具使用

本文介绍了一般的Diamond开发流程,包括工程创建、文件输入、IP使用、约束、管脚分配、和布线布局等流程

weixin_41895751的博客 2万+

debian linux系统安装教程,Debian 10(Buster)安装过程图文详解

Debian 项目发布了它的最新稳定版 Debian 10,其代号是 “Buster”,这个发布版将获得 5 年的支持。Debian 10 可用于 32 位和 64 位系统。这个发布版带来很多新的特色,列出下面一些特色:引入新的 Debian 10 的主题 “FuturePrototype”新版本的电脑桌面环境 GNOME 3.30、Cinnamon 3.8、KDE Plasma 5.14、MAT...

weixin_39864601的博客 4985

二叉树的递归和非递归遍历

二叉树的各种遍历方式,包括前序、中序、后序、层次遍历及它们各种实现方式 (递归、迭代)

GoWilli的优快云 1392

C++继承与多态 - 继承多态原理01

C++继承多态原理讲解

大秦坑王的专栏 2978

高级数据结构 | 二叉树遍历 —递归与非递归实现:先序、中序、后序遍历二叉树 ...

递归遍历二叉树 /* 先序遍历 */ void PreOrder(struct BtNode* p) { if (NULL != p) { printf("%c ", p->data); PreOrder(p->leftchild); PreOrder(p->rightchild); } } /* 中序遍历 */ void InOrder(struct BtNo...

专注于C/C++/Linux领域创作 539

Nvidia Jetson 编解码开发(3)解决H265解码报错“PPS id out of range”

基于之前的开发程序通过Jetson Xavier NX 硬编码的H265发出后,上位机断点播放发出来的H265码流,会报“PPS id out of range” 错误。

jzwjzw19900922的博客 3812

基于YOLO-world训练模型的完整教程:从数据准备到微调训练

本文提供了YOLO-world模型训练的完整教程,涵盖从环境配置到微调训练的全流程。首先介绍了YOLO-world项目的安装与配置步骤,包括依赖安装和CUDA环境设置;接着详细说明了数据集的准备方法,包括COCO格式数据集的组织结构和自定义数据集的类别定义;然后阐述了配置文件的修改要点,包括超参数调整和数据集路径设置;最后讲解了训练命令的使用方法及常见问题的解决方案。本教程旨在帮助读者快速掌握YOLO-world模型的训练技能,适用于计算机视觉领域的研究人员和开发者。

FJN110的博客 1108

二叉树的遍历(先序、中序、后序、层次)

参照王道数据结构辅导书以及哔哩哔哩大学的部分视频,对二叉树遍历的重要知识点进行归纳,并总结做题技巧。

kusunoki的博客 4万+

docker部署neo4j,设置密码。Neo.ClientError.Security.Unauthorized: The client is unauthorized due to authenti

卷,设置NEO4J_AUTH将不会起作用,因为该数据库已经配置了身份验证。Neo4j Docker 服务将会启动,但您需要使用已与该数据库关联的用户名和密码才能登录。这里,使用了环境变量NEO4J_AUTH,设置了用户名为neo4j,密码为neo4jneo4j。这个命令还是比较全的,包括设置密码,设置端口,挂载外部的数据目录等。原因嘛,就是使用docker创建的neo4j,登录不上。把👆提到的外挂的数据,都清空了,再重新来一遍。有一种情况下,这样设置密码,并不会成功。如果不出意外,目前就算大功告成了。

xiezhipu的博客 564

二叉树的前序、中序、后序遍历的代码实现

 三种遍历方式都分为递归与非递归的方式。三种遍历方式的递归思想相同。后序遍历非递归方法分为两种,具体见代码。 转载自:https://www.cnblogs.com/SunZhR/p/6594168.html构造方式: 1 #include&lt;iostream&gt; 2 #include&lt;stack&gt; 3 using namespace std; 4 5 typedef...

weixin_42154649的博客 2万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

二叉树的递归遍历算法就不用说了;在非递归算法中,后序遍历难度大,很多书上只给出思想或者几段无法直接调试的代码,甚至有些书上是错的,当时我在研究的过程中,就是按着书上错误的代码绕了好半天,几预抓狂

dearbaba_8520的博客 1万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

详解二叉树的遍历问题(前序、后序、中序、层序遍历的递归算法及非递归算法及其详细图示)

文章目录二叉树的遍历先序遍历 二叉树的遍历  所谓二叉树的遍历,是指按照某条搜索路径访问树中的每个结点,使得每个结点均被访问一次,且仅被访问一次。  由二叉树的递归定义可知,遍历一棵二叉树便要决定对根结点N、左子树L和右子树R的访问顺序。按照先遍历左子树再遍历右子树的原则,常见的遍历次序有先序(NLR)、中序(LNR)和后序(LRN)三种遍历算法,其中“序”指的是根结点在何时被访问。 先序遍历  先序遍历(PreOrder)的操作过程如下: ...

薛定谔的猫的博客 1861

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

非递归实现二叉树先序、中序和后序遍历

平时都写递归的,非递归的都忘光光了,学习一下???? 非递归实现二叉树先序、中序和后序遍历 用递归方式实现二叉树先序、中序和后序遍历很简单。 用递归方法解决的问题都能用非递归的方法实现。递归就是利用函数栈来保存信息,如果用自己申请的数据结构来代替函数栈,也可以实现相同的功能。 用非递归的方式实现二叉树的先序遍历(LeetCode144): 1、申请一个栈stack,然后将头节点压入stack中。 2、从stack中弹出栈顶节点,打印,再将其右孩子节点(不为空的话)先压入stack中,最后将其左孩

沐雨金鳞 869

Python 二叉树 先序中序后序 递归 和 非递归遍历、层次遍历

先建立一棵满二叉树,先给出层次遍历,再用三种递归的方式遍历,然后用三种非递归的方式遍历。

qq_41567413的博客 1513

C++ 二叉树的先序,中序,后序遍历

三种遍历方式都分为递归与非递归的方式。三种遍历方式的递归思想相同。后序遍历非递归方法分为两种,具体见代码。 构造方式: 1 #include<iostream> 2 #include<stack> 3 using namespace std; 4 5 typedef struct BiTNode{ 6 char...

diyang6487的专栏 1332

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

每年转战互联网行业的人很多,说白了也是冲着高薪去的,不管你是即将步入这个行业还是想转行,学习是必不可少的。作为一个Java开发,学习成了日常生活的一部分,不学习你就会被这个行业淘汰,这也是这个行业残酷的现实。如果你对Java感兴趣,想要转行改变自己,那就要趁着机遇行动起来。或许,这份限量版的Java零基础宝典能够对你有所帮助。《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

2301_82244623的博客 933

图解 前序、中序、后序、深度、广度遍历二叉树(js 递归 非递归实现)

后序遍历较为详细,配有图解,想看图解的,转到后序遍历,画图太麻烦了。。。 所以只画了后序的,欢迎评论区交流。 初始化树结构 var nodes = { node: 6, left: { node: 5, left: { node: 4 ...

weixin_43840538的博客 1517

C++ 二叉树遍历算法深度剖析(先序/中序/后序、及递归与非递归遍历法)

本文深入剖析C++二叉树遍历算法,系统讲解递归与非递归实现方法。文章首先展示二叉树遍历的整体架构,分为递归和非递归两大实现方式,每种方式包含先序、中序和后序遍历。递归算法部分详述系统栈机制和通用遍历框架;非递归算法则重点解析栈模拟原理,通过流程图和栈状态示例演示三种遍历的具体实现过程,特别针对后序遍历的难点进行说明。文章对比了两种实现的空间复杂度、风险、效率和调试难度等特性,并列举不同遍历方式的应用场景。最后提供完整的C++实现代码,包含节点定义和6种遍历方法(3种递归+3种非递归)。全文逻辑清晰,兼顾理论

liulilittle的博客 1127

数据结构 递归和非递归方式实现二叉树先序、中序和后序遍历

  二叉树的先序遍历顺序是根、左、右;中序遍历顺序是左、根、右;后序遍历顺序是左、右、根。   递归方式实现如下: 1 public class TreeNode { 2 private int value; 3 private TreeNode left, right; 4 5 public TreeNode(int data...

aotangai1607的博客 359

分别用递归和非递归方式实现二叉树先序、中序和后序遍历

【说明】:   本文是左程云老师所著的《程序员面试代码指南》第三章中“分别用递归和非递归方式实现二叉树先序、中序和后序遍历”这一题目的C++复现。   本文只包含问题描述、C++代码的实现以及简单的思路,不包含解析说明,具体的问题解析请参考原书。   感谢左程云老师的支持。 【题目】:   用递归和非递归的方式,分别按照二叉树先序、中...

diju7500的博客 295
上一篇: 算法学习12:两个单链表相交的一系列问题
下一篇: 算法学习14:二叉树的宽度优先遍历
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值