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

二叉树先序、中序、后序遍历非递归算法 二叉树先序、中序、后序遍历非递归算法,简述了二叉树的基本算法。 立即下载

本文对二叉树的前序遍历、中序遍历、后序遍历的递归和非递归算法分别进行了代码演示,供大家参考。代码如下:

public class BinaryTree {
	/**
	 * 二叉树的前序遍历递归算法
	 * 
	 * @param rootNode 二叉树的根节点
	 */
	public void preOrderbyRecursion(BinaryTreeNode rootNode) {
		if(rootNode != null) {
			visitNode(rootNode);
			preOrderbyRecursion(rootNode.getLchild());
			preOrderbyRecursion(rootNode.getRchild());
		}
	}
	
	/**
	 * 二叉树的前序遍历的非递归算法
	 * 
	 * @param rootNode 二叉树的根节点
	 */
	public void preOrderbyHeap(BinaryTreeNode rootNode) {
		LinkHeap lh = new LinkHeap();
		BinaryTreeNode p = rootNode;
		if(rootNode != null) {
			do {
				while(p != null) {
					visitNode(p);
					lh.push(p);
					p = p.getLchild();
				}
				p = (BinaryTreeNode)lh.pop();
				p = p.getRchild();
			}while(p != null || !lh.isEmpty());
		}
	}
	
	/**
	 * 二叉树的中序遍历递归算法
	 * 
	 * @param rootNode 二叉树的根节点
	 */
	public void inOrderbyRecursion(BinaryTreeNode rootNode) {
		if(rootNode != null) {
			inOrderbyRecursion(rootNode.getLchild());
			visitNode(rootNode);
			inOrderbyRecursion(rootNode.getRchild());
		}
	}
	
	/**
	 * 二叉树的中序遍历的非递归算法
	 * 
	 * @param rootNode 二叉树的根节点
	 */
	public void inOrderbyHeap(BinaryTreeNode rootNode) {
		LinkHeap lh = new LinkHeap();
		BinaryTreeNode p = rootNode;
		if(rootNode != null) {
			do {
				while(p != null) {
					lh.push(p);
					p = p.getLchild();
				}
				p = (BinaryTreeNode)lh.pop();
				visitNode(p);
				p = p.getRchild();
			} while(p != null || !lh.isEmpty());
		}
	}
	
	/**
	 * 二叉树的后序遍历递归算法
	 * 
	 * @param rootNode 二叉树的根节点
	 */
	public void postOrderbyRecursion(BinaryTreeNode rootNode) {
		if(rootNode != null) {
			postOrderbyRecursion(rootNode.getLchild());
			postOrderbyRecursion(rootNode.getRchild());
			visitNode(rootNode);
		}
	}
	
	/**
	 * 二叉树的后序遍历的非递归算法
	 * 
	 * @param rootNode 二叉树的根节点
	 */
	public void postOrderbyHeap(BinaryTreeNode rootNode) {
		LinkHeap lhNode = new LinkHeap();
		LinkHeap lhFlag = new LinkHeap();
		BinaryTreeNode p = rootNode;
		int flag = 0;
		if(rootNode != null) {
			do {
				while (p != null) {
					lhNode.push(p);
					lhFlag.push(0);
					p = p.getLchild();
				}
				p = (BinaryTreeNode)lhNode.pop();
				flag = (int)lhFlag.pop();
				if(flag == 0) {
					lhNode.push(p);
					lhFlag.push(1);
					p = p.getRchild();
				} else {
					visitNode(p);
					p = null;
				}
			}while(p != null || !lhNode.isEmpty());
		}
	}
	
	private void visitNode(BinaryTreeNode p) {
		System.out.print(p.getData() + " ");
	}
}

算法中出现的二叉树结点类BinaryTreeNode如下:

public class BinaryTreeNode {
	private Object data;
	private BinaryTreeNode lchild;
	private BinaryTreeNode rchild;
	public Object getData() {
		return data;
	}
	public void setData(Object data) {
		this.data = data;
	}
	public BinaryTreeNode getLchild() {
		return lchild;
	}
	public void setLchild(BinaryTreeNode lchild) {
		this.lchild = lchild;
	}
	public BinaryTreeNode getRchild() {
		return rchild;
	}
	public void setRchild(BinaryTreeNode rchild) {
		this.rchild = rchild;
	}
	
	public BinaryTreeNode() {
		this.data = null;
		this.lchild = null;
		this.rchild = null;
	}
	public BinaryTreeNode(Object data) {
		this.data = data;
		this.lchild = null;
		this.rchild = null;
	}
}

算法中出现的链式堆栈类LinkHeap如下:

public class LinkHeap {
	
	private LinkHeapNode topNode = null;
	
	public boolean isEmpty() {
		return topNode == null;
	}
	
	public void push(Object data) {
		LinkHeapNode p = new LinkHeapNode(data, topNode);
		topNode = p;
	}
	
	public Object pop() {
		if(isEmpty()) {
			return null;
		}
		else {
			Object data = topNode.getData();
			topNode = topNode.getNext();
			return data;
		}
	}
	
	public Object get() {
		return isEmpty() ? null : topNode.getData();
	}
}
链栈类中出现的链栈结点类LinkHeapNode的代码如下:

public class LinkHeapNode {
	private Object data;
	private LinkHeapNode next;
	
	public LinkHeapNode() {
		this.data = null;
		this.next = null;
	}
	
	public LinkHeapNode(Object data) {
		this.data = data;
		this.next = null;
	}
	public LinkHeapNode(Object data, LinkHeapNode next) {
		this.data = data;
		this.next = next;
	}
	
	public Object getData() {
		return data;
	}
	
	public void setData(Object data) {
		this.data = data;
	}
	
	public LinkHeapNode getNext() {
		return next;
	}
	
	public void setNext(LinkHeapNode next) {
		this.next = next;
	}
}



遍历二叉树 遍历二叉树的先序、中序和非递归遍历二叉树的六种算法 遍历二叉树 遍历二叉树的先序、中序和非递归遍历二叉树的六种算法 立即下载

相关推荐

C++ 二叉树的先序遍历、中序遍历和后序遍历非递归算法

用C++写的,包括二叉树的构建,二叉树的先序遍历、中序遍历和后序遍历非递归算法。

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

目录 前序遍历 递归实现 非递归实现 中序遍历 递归实现 递归实现 后序遍历 递归实现 非递归实现 二叉树是一种非常经典的数据结构,它的应用途径十分广泛,但同时它也是一种简单的、易理解的数据结构,解决二叉树问题的核心思想是递归,在初次接触到二叉树这种数据结构时,它的递归方式遍历很容易理解,但当要求以非递归方式来实现遍历时,就显得手足无措了,本篇博客以递归和非递归两种方式实现二叉树的遍历. 前序遍历 前序遍历的顺序为:首先访问根结点,然后遍历左子树,最...

qq_58284486的博客 5495

二叉树先序、中序、后序遍历(递归、非递归算法)

二叉树先序、中序、后序遍历(递归、非递归算法) 其中自己已经开发了栈!

二叉树的四种遍历方法(前序遍历的递归与非递归、中序遍历的递归与非递归、后序遍历的递归与非递归、层次遍历)

二叉树的四种遍历方法(前序遍历的递归与非递归、中序遍历的递归与非递归、后序遍历的递归与非递归、层次遍历)

鱼骨图lkr的博客 126

c语言实现二叉树的前中后序遍历 递归和非递归 数据结构

1.输入前序和中序遍历结果,建立二叉树 2.实现二叉树的三种递归遍历算方法 3.实现二叉树的三种非递归遍历算法 4.实现二叉树的旋转90°后的打印,直观树形结构

mysql 计算不同胜率的活跃玩家的次日,3日,7日留存率

它根据每天的日期(logymd)和最高段位(max_rank)、胜率段落(win_rate_segment)进行分组,并计算总玩家人数(total_players)、第二天的留存人数(next_day_players)、第三天的留存人数(day3_players)和第七天的留存人数(day7_players)。注意:不是新手留存,是段位活跃玩家留存;最终的结果则是将留存数据进行展示,按照日期(date)、最高段位(rank_level)、胜率段落(win_rate_segment)进行排序。

weixin_42698221的博客 1836

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

二叉树前序遍历、中序遍历、后序遍历 递归和非递归方式实现 前序遍历: 1.1代码参考链接:https://www.nowcoder.com/profile/4128283/codeBookDetail?submissionId=17438738 递归方法: vector<int> preorderTraversal(TreeNode *root)//递归实现前序遍历 {...

yimixgg的博客 701

【传感器标定(三):激光雷达标定原理与实现详解】

本文系统介绍了激光雷达标定的基本原理与方法。主要内容包括:激光雷达标定的分类(内参标定和外参标定)、坐标系定义和刚体变换数学基础;详细阐述了测距误差和光束方向两种内参标定方法;重点分析了基于目标(平面标定板、三维标定物)和基于运动(手眼标定、点云配准)的外参标定方法;介绍了多传感器联合标定技术及非线性优化、鲁棒标定等实现方法;最后提出了定量和定性两种标定评估体系。为激光雷达在自动驾驶等领域的精确应用提供了系统的标定技术指导。

weixin_47429781的博客 3789

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

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

沐雨金鳞 869

为什么AI时代的优秀组织,都在学习Meta的Pod结构?看完秒懂

当AI技术重塑产业格局,企业协作正面临前所未有的挑战——层级繁琐、跨部门内耗、迭代滞后,传统组织模式早已难以跟上技术革新的步伐。作为全球AI原生企业的标杆,Meta独创的Pod组织模式,用“小而美”的自治单元打破困局,成为AI时代高效协作的典范。本文将从定义、运作、价值到未来演进,全面拆解Pod模式,为企业组织变革提供可参考的思路与路径。德鲁克曾说:“组织的功能就是让平凡的人做平凡的事。”而Meta Pod打破这一局限,通过去中心化、指标导向、跨界融合,让优秀人才产生“化学反应”。

Kiss_AIHR的博客 1170

P+F--r2000激光雷达slam技术实现

P+F--r2000激光雷达slam技术实现

majingming123的博客 1667

二叉树遍历之前序遍历(递归与非递归)

二叉树的遍历方法一共有很多,今天我们先来了解一下二叉树的前序遍历 前序遍历的顺序:根、左子树、右子树 如图中这棵树前序的遍历结果应该是1、2、4、8、9、5、3、6、7 先根1 ,然后左子树(我们要先处理完这整棵左子树再去看1的右子树),左子树在根2,然后又是左子树,根4,然后又是左子树,8,8在没有左边,所以接下来是4的右边9,然后是2的右边5,然后是1的整棵右子树,也遵循同样的规律根3,左子树6,6在没有左,则是右7,结束。 想要遍历树,就要先有一棵树,我们的现在的重点在于如何遍历二叉树, 我们先手动

scarificed的博客 5831

Palantir的本体论建模跟数仓建模的异同

Palantir的Foundry Ontology通过构建组织的数字孪生体,将数据集和模型映射为对象类型、属性、链接和操作类型,形成完整的语义知识网络。与传统数仓建模相比,本体建模以业务问题为驱动,强调细粒度语义和实时决策能力,采用图语义技术实现灵活的映射关系。

轩哥的个人研究和成长记录 1594

用堆栈实现二叉树的前序遍历/中序遍历/后序遍历的非递归算法

用堆栈实现二叉树的前序遍历/中序遍历/后序遍历的非递归算法算法思想中序遍历前序遍历后续遍历 算法思想 借助堆栈实现前序遍历、中序遍历非递归程序的本质是利用堆栈模拟递归函数调用时的入栈和出栈过程。而前序遍历、中序遍历和后序遍历在递归函数执行时,结点(作为函数参数)的入栈和出栈过程是完全一样的。 前序遍历是在结点入栈时输出结点信息,然后开始分别对该结点左右子树的遍历;而在中序遍历中,结点出栈时表明刚完成对该结点左子树的遍历,此时可输出该结点信息。 后序遍历必须在左右子树均输出的情况下才能输出该结点。

White_Beard_C的博客 1952

流体动力学仿真软件:Star-CCM+_(19).软件定制与脚本编写

自定义插件开发可以扩展Star-CCM+的功能,实现特定的仿真需求。插件开发通常需要使用Java语言,并且需要对Star-CCM+的API有深入的了解。以下是一个简单的Java插件示例,展示如何创建一个自定义插件来显示仿真项目的信息。// 导入必要的Star-CCM+ API import star . ccm . product . CCMProject;// 自定义插件类 public class CustomPlugin {// 插件主方法 public void run() {

kkchenjj的博客 937

YOLOv8 改进:添加 LSK 注意力机制

通过添加 LSK 注意力机制,YOLOv8 能够更有效地捕捉特征图上的重要信息,提高检测性能,尤其是在复杂场景下展现出色的表现。这种方法不仅适用于资源受限的设备,还能在丰富多样的实际应用中提供强劲支持。

走向CTO的路上... 1221

二叉树前序遍历、中序遍历、后序遍历递归以及非递归算法详解以及代码整合

引文 对二叉树的前中后序递归以及非递归算法以及层序遍历思想做了整合 因为某些书籍上对这类算法,写的非常笼统,所以,这里将从树的链式存储开始,结合整个 链表、栈、队列等结构来完成对树的学习,当然,这里也将会完美的列出所用的栈、队列等结构,直接复制代码即可运行。 说明:下面代码 在定义的时候可能不会遵循一般的编程规范,比如这些愚蠢的结构体的名字(因为这就是为了考试用的)。请已经工作了的童鞋理解(虽然我自己都非常想吐槽)

朱子恒的博客 2064

【华为OD技术面试真题 - 技术面】- C++面试题(1)

2024华为OD面试手撕代码真题目录以及八股文真题目录

算法大师! 3398

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

package

weixin_39641231的博客 151

OV9734 DATASHEET,完整规格书

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

efm32 入门.pdf

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

二叉树的初始化以及二叉树的前序遍历,中序遍历,后序遍历的递归和非递归算法

前几天回家过中秋,我一直在想二叉树的3种遍历方法,今天在图书馆自习的时候想出来了,现在我跟大家先分享一下二叉树的3种遍历的递归算法,递归算法很简单,关键在于理解二叉树遍历的核心思想,话不多说,我们直接看代码: #include<iostream> #include<queue> using namespace std; struct TreeNode{ int val;...

zxydqq的博客 435

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

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

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

薛定谔的猫的博客 1861

C++——二叉树的前序遍历||中序遍历||后序遍历 非递归算法

二叉树的前序遍历,非递归迭代实现 二叉树的中序遍历 ,非递归迭代实现 二叉树的后序遍历 ,非递归迭代实现 思路及其代码

博主qq1077644249 735

扩展二叉树 建立 以及 前序遍历 中序遍历 后序遍历 的非递归算法

#include #include using namespace std; struct Node{ char data; Node * left; Node * right; }; void Create(Node * &root) { //qian xu jian li char ch; cin>>ch; if(ch=='#') { root=NULL;

zhou2214的专栏 943

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

了解二叉树中遍历的方法以及实现,其中包括递归算法和非递归

chenjia0512的博客 2173

由前序遍历和中序遍历还原二叉树非递归算法

原理:前序遍历的第一个为根结点,在中序遍历中找到对应的结点位置后,在该位置左侧为根结点的左子树,在该位置右侧的为右子树,并可以找到在前序遍历中根结点左子树的的前序遍历和右子树的前序遍历,这两个数组的第一个就分别为根结点的左右孩子。 思路:一层一层的还原二叉树,还原一层的结点需要两种信息,上一层的所有结点,以及上一层每个结点左右孩子的信息。 还原算法以及前序、中序和后序遍历非递归算法 pac...

Backee的博客 1440

二叉树的前序,中序,后序遍历非递归算法(包含二叉树的建立和层序遍历)

相比祖传的递归算法,非递归算法会麻烦很多,尤其是后续遍历的非递归算法,这些算法都借助了栈的数据结构,理解上的问题这里不多讲,我在代码里都加了较多注释,大家放心看便是 头文件: #ifndef BITREE_H #define BITREE_H #include<iostream> #include<string> #include<stack> using namespace std; const int SIZE = 100; template<typena

亦话的博客 312
上一篇: 二叉树的顺序存储和链式存储
下一篇: POJO
bbewx
博客等级 码龄16年 29粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值