首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

二 叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。...因为树的定义本身就是 递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。...在三种遍历中, 前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。 一.前序遍历    前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。  ...,访问该栈顶结点,然后将当前的P置为栈顶结点的右孩子;   3)直到P为NULL并且栈为空则遍历结束 //非递归中序遍历  void in_order(BTree *root)        {  ...       后序遍历的非递归实现是三种遍历方式中最难的一种。

1.5K100

二叉树的非递归遍历

代码演示 stack.h里面的代码: #pragma once #include #include #define MAX 1024 //这里的栈已经知道数组的最大长度...,因此不需要再用在堆区再次开辟一块内存来用二级指针指向 struct sStack { //因为不确定用户数据类型,所以用void*指针来接收用户输入的数据地址 //指针数组----里面存放的是地址或者指针...void* data[MAX]; int size; }; //隐藏数据,不让用户能够得到操作结构体的接口 //类似c++类中的private属性 typedef void* seqStack;...} main.cpp #define _CRT_SECURE_NO_WARNINGS #include #include #include"stack.h" //二叉树的非递归遍历...struct BinaryNode { //数据域 char ch; //指针域 BinaryNode* lchild; //指向左孩子的指针 BinaryNode* rchild; //指向右孩子的指针

40410
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    二叉树的非递归遍历

    二叉树的非递归遍历          二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的...对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。...在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。 一.前序遍历    前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。   ...       后序遍历的非递归实现是三种遍历方式中最难的一种。...=NULL) s.push(cur->lchild); } } }  四.整个程序完整的代码 /*二叉树的遍历* 2011.8.25

    76010

    二叉树后序遍历的非递归实现_二叉树的后序遍历非递归详细

    一、递归实现前序,序,后序遍历; 对于二叉树,前面已经采用递归的方式实现的其前序,中序,后序遍历,具体请参见: http://blog.csdn.net/dai_wen/article/details/...78955411 那么,如何采用非递归的方式遍历树呢?...下面,以实现中序遍历二叉树为主题展开: 二、非递归实现 中序遍历: 1,结构: 首先,对于中序遍历,我们知道,原则是先走到的结点后访问,后走到的结点先访问,这显然是栈的结构; 2,访问结点的具体步骤:...: 那么,根据文字,画出如下流程图: //下面,举个例子: 如下所示的五个结点的二叉树,其非递归中序遍历如下图所示: (1)实现思路图如下所示: (2)具体程序实现: #include <...{ t = s.top(); //非空就从栈顶拿元素 s.pop(); } else //如果没有右孩子,并且栈为空 t = NULL; { t = NULL; }

    47330

    如何获取非模式生物KEGG PATHWAY的基因集并用clusterProfile做GSEA?

    下面是四川成都大熊猫基地学员原创教程 作者 so_zy, 2020-10-14 写此文档的缘由:在做GSEA分析时,由于研究的是非模式生物,从Broad Institue开发的MSigDB没有找到合适的预设基因集...写此文档为其他研究非模式生物的人员提供一点借鉴。 以大熊猫为例: 1. 安装并加载R包 正常情况下,大家安装R包应该是都问题不大了。...require(stringr))install.packages('stringr') library(stringr) 2.查询大熊猫在KEGG数据库中的缩写 #获取KEGG数据库收录的所有物种的清单...3.获取大熊猫的KEGG通路及基因集 aml_path <- keggLink("pathway","aml") #得到字符型向量。元素名为基因id,元素为通路名....4.获取用于GSEA的基因集数据框 #数据整理,将向量转变为数据框,作为GSEA的基因集 aml.kegg <- data.frame(term=unname(aml_path),gene=names(

    3.4K20

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

    二 叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。...在三种遍历中, 前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。 一.前序遍历    前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。  ...*p = root; //定义指针p并使树根指针为它的初值 //当栈非空或p指针非空时执行循环 while (p !...        后序遍历的非递归实现是三种遍历方式中最难的一种。...= NULL)               q.push(p->rchild);       }   }   五.二叉树的其他一些应用 1.求二叉树的深度 若一棵二叉树为空,则它的深度为0,否则它的深度等于左子树和右子树中的最大深度加

    1.2K80

    树:普通树(非二叉树)的遍历

    树的遍历方式只有两种:先根遍历、后根遍历; 二叉树的遍历方式有四种:前序遍历、中序遍历、后序遍历、层序遍历; 树的先根遍历 树的先根遍历简单而言就与,二叉树的前序遍历相似,都是“根左右”,只不过在左右之分上面...,不是简单的只是左右而已,而是同一层上面的节点,从左边的节点遍历结束之后才轮到右边的下一个节点(同一层不一定只是左右两个节点); 树的后根遍历 树的后根遍历简单而言就与,二叉树的后序遍历相似,都是“左右根...”,只不过在左右之分上面,并没有二叉树那么明确而已。...其实树的遍历与二叉树的遍历都是相似的,只不过没有了明确的左右子树的划分而已。...树转换为二叉树 1.把根节点的子节点,除了最左边的节点,其他的都断开; 2.把断开的子节点横向连接起来,连到当前层的最左节点(还连接在上一层根节点上),作为该节点的右子树; 发布者:全栈程序员栈长,转载请注明出处

    36420

    如何在非Spring容器管理的类中注入获取 Spring容器中的 Bean?

    如何在非Spring容器管理的类中注入/获取 Spring容器中的 Bean? 前言:此文仅限新手入行,大佬回避。...我们在使用Spring开发程序的时候,Spring提供了很方便的对象管理方式,即IOC,而且也提供了非常友好便捷的对象注入方式DI, 只要是被Spring容器所管理的类,就可以使用@Resource或者...什么是被Spring容器管理的类? 只要是被称之为Bean的类就是被Spring容器管理的类。...不了解的可以看看小简写的这一篇: 将Bean交给Spring容器管理的几种方式 在非Spring管理的类中怎么办? 有时候我们就是需要在非Spring管理的类中使用Bean怎么办呢?...“不可能的,很少见” “一般碰不到的” 很多入职的新人可能会这样想,但是!我告诉你,很多情况都会要使用到这个。

    4.7K40

    【数据结构】树与二叉树(三):二叉树的定义、特点、性质及相关证明

    5.1 树的基本概念 5.1.1 树的定义 一棵树是结点的有限集合T: 若T非空,则: 有一个特别标出的结点,称作该树的根,记为root(T); 其余结点分成若干个不相交的非空集合T1...引理5.3:设T是由n个结点构成的二叉树,其中叶结点个数为 n_0 ,度数为2的结点个数为 n_2 ,则有 n_0 = n_2 + 1 。...这个引理描述了二叉树中叶结点和度数为2的结点之间的关系,即叶结点的数量比度数为2的结点数量多1。 引理5.1:二叉树中层数为i的结点至多有 2^i 个,其中 i \geq 0 。   ...因此,根据数学归纳法,对于任意非负整数 i ,二叉树中层数为 i 的结点至多有 2^i 个。...设T是由 n 个结点构成的二叉树,其中叶结点个数为 n_{0} ,次数为2的结点个数为 n_{2} 。

    18710

    二叉树遍历算法的改进(非递归实现)

    二叉树遍历算法的改进 二叉树的深度优先遍历算法都是用递归函数实现的,这是很低效的,原因在于系统帮你调用了一个栈并做了诸如保护现场和恢复现场等复杂的操作,才使得遍历可以用非常简洁的代码实现。...二叉树深度优先遍历算法的非递归实现用用户定义的栈来代替系统栈,也就是用非递归的方式来实现遍历算法,可以得到不小的效率提升。...二叉树深度优先遍历算法的非递归实现 (1)先序遍历非递归算法 要写出其遍历的非递归算法,其主要任务是用自己定义的栈来代替系统栈的功能。 以图1所示的二叉树为例,过程为图二所示 初态栈空 结点1入栈。...,对图1中的二叉树进行中序遍历,各个结点进栈、出栈过程如图3所示。...p = p->rchild; } } } } (3)后序遍历非递归算法 首先写出图1中二叉树进行先序遍历和后序遍历的序列

    72200

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

    二叉树也是常用的数据结构,通过使用二叉树可以快速的对数据进行排序或者查找,在常用的堆排序算法中,堆的底层实质就是一个模拟的完全二叉树!等等,什么是完全二叉树?二叉树又是什么?有哪几类?...让我们开始今天的算法课堂~ 二叉数的概念和分类 二叉树是每个树节点最多有两个子树的一种特殊的树结构,其有一些内在的性质,比如,若二叉树的层次从0开始,则在二叉树的第i层至多有2^i个节点(i>=0),高度为...,对其进行中序遍历后,会得到一个有序的列表,这是我们经常用到的一种数的结构 平衡二叉树:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树,并且满足二叉搜索树的规则...满二叉搜索树 二叉树的遍历 ? 二叉树的遍历有三种方式:先序遍历,中序遍历,后序遍历。思路很简单,这里面说的顺序的序是指每个子树根节点的遍历(打印)顺序。...(先、中、后序) 首先我们要清楚,任何算法的递归版本都可以改成非递归版本,因为函数递归调用其实质就是压栈的过程,那么我们完全可以使用堆栈来模拟这个过程!

    95030

    EB级别云存储是如何涨成的?

    面对存储规模快速增长、应用数据多样化等挑战如何应对?大数据AI如火如荼,用户对数据存储的诉求从基本的稳定性、可靠性、性能到现在又发生了怎样的变化?...早在2006年,腾讯分布式存储系统平台TFS,就开始为腾讯集团所有的业务提供数据存储的服务。至2015年,规模已达EB级、用户数已达数十亿级别。...即使在CDN回源率较高的情况下,也能支撑住大量的并发访问。 对于用户已有源站的情况下,如何将源站内容快速迁移到云存储,也应生出“回源设置”的功能。...微信存储使用案例 不同时代对云存储的诉求,促进了腾讯云存储的不断发展,包括在高可靠性、高性能、更丰富的功能、更完善的方案。但如何能让应用和存储完美结合,仅从存储端着手,是远远不够的。...、广电非编媒资方案等。

    3.5K53

    【二叉树打卡5】二叉树的后序遍历(非递归版)

    【题目】 按照二叉树的后序遍历打印二叉树,并且不能使用递归。...【难度】 易 解答 没看过前序遍历和中序遍历的或许可以先看下: 【二叉树打卡3】二叉树的先序遍历(非递归版) 【二叉树打卡4】二叉树的中序遍历(非递归版) 二叉树的后序遍历顺序是左-右-根。...我们可以采用一个栈来辅助,不过它和前序遍历以及中序遍历还是有点区别的,我们把后序遍历的结果放到一个 LinkedList 容器中作为返回值,具体步骤如下: 1、把二叉树的根节点 root 放进栈。...2、如果栈不为空,从栈中取出一个节点,把该节点插入到容器的头部。;如果该节点的左子树不为空,则把该左子树放入栈中;如果该节点的右子树不为空,则把右子树放入栈中。..., 注意,之前的前序遍历和中序遍历,我们都是用 ArrayList 容器,并且是把节点插入到容器的尾部,这就是后序遍历的不同点。

    71050
    领券