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

二叉树的遍历(递归And迭代)

二叉树的遍历 以 1 二叉树为例讲解: ​ 2 3 4 5 6 7 递归法 思路: 按照递归调用的机制,我们按照只要遍历到就打印的方式得到的数据为: ​ 【1,2,4,4...,4,2,5,5,5,2,1,3,6,6,6,3,7,7,7,3,1】 前序遍历 ​ 我们将前序遍历所得到的数据都是在调用递归机制的元素首次出现的位置,那么按照前序遍历:【中 - 左 - 右】的顺序即可完成...= null){ this.right.prefix(); } } 中序遍历 ​ 中序遍历所得到的数据都是在调用递归机制的元素第二次出现的位置,那么按照前序遍历:【左 - 中 -...= null){ this.right.infix(); } } 后序遍历 ​ 后序遍历所得到的数据都是在调用递归机制的元素最后一次出现的位置,那么按照前序遍历:【左 - 右 -...= null){ this.right.suffix(); } System.out.println(this); } ​ 迭代法 思路: ​ 首先我们来了解一下递归的实现

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

    java递归和迭代_Java中的迭代与递归

    迭代 另外一种计算n!的方式是:先计算1乘以2,而后用其结果乘以3,再用的到的结果乘以4….一直乘到N。在程序实现时,可以定义一个计数器,每进行一次乘法,计数器都自增一次,直到计数器的值等于N截至。...所以,使用递归实现一个计算逻辑往往只要要很短的代码就能处理,并且这样的代码也比较容易了解。但是,递归就意味着大量的函数调用。函数调用的局部状态之所以用栈来记录的。...所以,这样即可能白费大量的空间,假如递归太深的话还有可能导致堆栈溢出。 接下来分析迭代。其实,递归都可以用迭代来代替。但是相对于递归的简单易懂,迭代就比较生硬难懂了。...尤其是遇到一个比较复杂的场景的时候。但是,代码的难以了解带来的有点也比较显著。迭代的效率比递归要高,并且在空间消耗上也比较小。 递归中肯定有迭代,但是迭代中不肯定有递归,大部分可以相互转换。...能用迭代的不要用递归,递归调用函数不仅白费空间,假如递归太深的话还容易造成堆栈的溢出。 数形递归 前面详情过,树递归随输入的增长的信息量呈指数级增长。

    2.3K40

    c语言函数的迭代与递归_递归与迭代

    递归的子问题一定要有解。(即递归一定要有回归条件。)...递归有两个过程: 递推:层层推进,分解问题 回归:层层回归,返回较大问题的解 递归函数的缺陷: 1.对栈的依赖性太高,需要耗费大量的栈空间来实现递推过程 2.逻辑简单,好理解。...= 3; i <= n; i++) { n3 = n1 + n2; n1 = n2; n2 = n3; } return n3; } 递归和迭代的区别: 1.什么是递归 是一种算法思想:是将大问题分解成若干个结构相同的子问题...递归有两个过程: 递推 回归 2.什么是迭代 迭代是对递归的一种优化,递归将递推的过程交给了计算机,让计算机代替人去分析问题。而迭代将递推(归纳抽象解决方案)的过程交给 了程序员。...3.递归的特点 1.解放了人 2.对栈的消耗大 3.算法的效率低下,不能过多层的递归 4.迭代的特点 1.需要人去分析迭代过程 2.减小的对栈的开销 3.算法的效率高 5.什么时候使用递归 1.递归层次不多

    1.3K10

    让遍历变得如此简单:学习迭代器模式优化代码逻辑

    上篇文章我们讲了观察者模式,今天我们讲个超简单的模式:迭代器模式。 前言 还是把这张概总图放这里。 正式讲解迭代器模式前,我们先来看迭代器。 在现实世界中,许多对象都不是独立存在的。...示例中,通过迭代器对用户名集合进行了逐一遍历。这就是迭代器的功能。 Java 中的 Iterator(迭代器)就是迭代器模式的实现。 ps:不同编程语言在实现上稍有差别,主要是语言特性的原因。...简单来说,不同种类的对象可能需要不同的遍历方式,我们对每一种类型的对象配一个迭代器,最后多个迭代器合成一个。 迭代器模式的优缺点如下: 优点 访问一个聚合对象的内容而无须暴露它的内部表示。...遍历任务交由迭代器完成,这简化了聚合类。 它支持以不同方式遍历一个聚合,甚至可以自定义迭代器的子类以支持新的遍历。 增加新的聚合类和迭代器类都很方便,无须修改原有代码。...主要缺点 由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。 最后 总结起来,迭代器模式是一种行为型设计模式。

    17520

    递归和迭代的对比

    大家好,又见面了,我是你们的朋友全栈君。 待到秋来九月八,我花开后百花杀 递归 迭代 特点 递归 程序调用自身的编程技巧称为递归(recursion)。...每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。重复执行一系列运算步骤,从前面的量依次求出后面的量的过程。...,递归代码块更加简洁轻便,而迭代冗长。...那么我们再看一下递归在内存中的情况: 我们拿阶乘问题作例子: 在程序递归过程中,每调用一次函数就会创建一个栈帧结构,而在每个栈帧结构中就会创建各自的局部变量,就会占用内存,相比于迭代,在内存方面...综上所述,尽管递归看起来代码简单,但是无论是时间复杂度和空间复杂度来说都是迭代更好,所以在项目中还是推荐使用迭代而不是递归。

    93910

    Java之集合的遍历与迭代器

    集合的遍历 依次获取集合中的每一个元素 将集合转换成数组,遍历数组 //取出所有的学号, 迭代之后显示学号为1004-1009 Object[] c=map.keySet().toArray...if(n>=1004&&n<=1009){ System.out.println(n); } }  for循环与迭代器...迭代器的原理 迭代器为什么是一个接口而不是一个类? 如果迭代器是一个类,这样我们就可以创建迭代器的对象,使用该类的方法来事先集合的遍历。...但是Java中有不同的集合类,这些类的数据结构也是不同的,所以存储方式和遍历方式也应该是不同的,所以使用将迭代器定义为一个类是不适合的。...迭代器的源码 public interface Inteator { boolean hasNext(); Object next(); } public interface Iterable

    1K50

    迭代器模式,更高大上的遍历体验!

    每次要遍历一遍数组怎么办?For 循环!或者while循环,一个一个访问每个位置的元素,直到数组末尾。STL里面甚至有专门的迭代器,针对具体的集合类对象,有对应使用的迭代器。...STL的迭代器提供了丰富的遍历方法,如访问集合对象的首位元素、末位元素、指定位置的元素、下一个元素……怎么样,是不是感觉有了迭代器,遍历方法不再是难事了?...针对聚合对象的遍历,迭代器模式是一种很有效的解决方案,也是一种使用频率很高的设计模式。 迭代器模式: 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。...通过引入迭代器,可以将数据的遍历功能从聚合对象中分离出来,这样一来,聚合对象只需负责存储数据,而迭代器对象负责遍历数据,使得聚合对象的职责更加单一,符合单一职责原则。...03 迭代器模式代码实例 电视机遥控器是迭代器的一个现实应用,通过它可以实现对电视频道集合的遍历操作,电视机可以看成一个存储频道的聚合对象。

    52010

    关于迭代与递归的补充

    这是函数的最后一章,下一章《字典》快点学习吧,开始我们的笔记 等等,差点忘记了,为了赶时间,我只能舍弃无关的图片,但又要保障大家的质量。...在编程的时候,没有递归结束条件或者递归过深,一般会造成栈溢出。 网络 怎么样理解了吗?有的同学对迭代也不了解,这里也提一下 迭代算法是用计算机解决问题的一种基本方法。...它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。为什么使用迭代而不用递归呢?...很明显,使用递归时每调用一次,就需要在栈上开辟一块空间,而使用迭代就不需要了,因此,很多时候设计出了递归算法,还要想法设法修改成迭代算法。 网络 这样的解释懂了吧。...递归从原理上来讲就是不断地调用自身的一个行为,迭代就是重复同一个操作的,并从原有的值变成新值 例子 >>> def number(): ...

    52320

    Python NumPy迭代器协议与高效遍历

    在数据科学和数值计算中,高效地遍历数组是一个常见需求。虽然 Python 提供了基本的迭代器协议,但在处理大规模 NumPy 数组时,直接使用 Python 的循环效率较低。...为此,NumPy 提供了更高效的迭代工具,如nditer和ndenumerate,通过优化底层操作,显著提升了遍历性能。此外,了解 NumPy 的迭代器协议还可以更灵活地处理多维数组。...一维数组迭代 import numpy as np # 创建一维数组 arr = np.array([1, 2, 3, 4, 5]) # 使用 Python 的迭代器遍历 for element in...高效迭代工具 NumPy 提供了以下高级工具来优化数组遍历: nditer:高效遍历工具 nditer 是 NumPy 提供的高效多维数组迭代器,可以逐元素遍历数组。...性能优化技巧 避免冗余操作 在迭代中,避免对数组元素进行重复计算: # 示例:计算每个元素的平方 result = np.array([x ** 2 for x in arr.flat]) 尽量将计算逻辑向量化

    25010

    java迭代和 递归的异同_递归和迭代有什么区别?简述区别

    大家好,又见面了,我是你们的朋友全栈君。 你对于递归和迭代都了解吗?那么你是否知道递归和迭代的区别呢?那么下面就和小编一起来了解一下,这两者之间的区别究竟是怎样的吧!...一、递归和迭代区别 首先我们要讲到的就是两者之间的概念。 首先,程序调用自身的编程技巧叫做递归,函数自己调用自己。 一个函数在它的定义当中,直接或者是间接的调用自身的一种方法。...迭代利用变量的原值推算出变量的一个新值。 假如,递归是自己调用自己的话,那么就是A不停的调用B。 在递归当中是一定有迭代的,可是,在迭代当中,却不一定存在递归。 大部分的都是可以相互进行转换的。...可以用迭代的就不用递归,递归调用函数,比较的浪费空间,除此之外,递归还非常容易造成堆栈的溢出。 递归和迭代都是循环的一种。...在递归循环当中,在遇到了满足终止条件的时候,逐层返回来结束。 迭代的话就是使用计数器来结束循环。 当然了,在大多数的情况之下,都是多种循环混合采用,这里的话,要依据具体的需求。

    54910

    java递归和迭代的区别

    大家好,又见面了,我是你们的朋友全栈君。 能使用迭代的不适用递归,另外一半递归有明确的父子关系或者 数据逐级演变为简单的算法!...递归是将上一步结果不断的压入站内, 所以递归很容易出现栈的溢出.而迭代不会! 递归的基本概念:程序调用自身的编程技巧称为递归,是函数自己调用自己....使用递归要注意的有两点: 1)递归就是在过程或函数里面调用自身; 2)在使用递归时,必须有一个明确的递归结束条件,称为递归出口....迭代:利用变量的原值推算出变量的一个新值.如果递归是自己调用自己的话,迭代就是A不停的调用B....递归中一定有迭代,但是迭代中不一定有递归,大部分可以相互转换.能用迭代的不用递归,递归调用函数,浪费空间,并且递归太深容易造成堆栈的溢出.

    58420

    迭代与递归的区别「建议收藏」

    大家好,又见面了,我是你们的朋友全栈君。 迭代和递归的区别: 从“编程之美”的角度看,可以借用一句非常经典的话:“迭代是人,递归是神!”来从宏观上对二者进行把握。...迭代不像递归那样对堆栈有一定的要求,另外一旦问题剖析完毕,就可以很容易的通过循环加以实现。...迭代的效率高,但却不太容易理解,当遇到数据结构的设计时,比如图表、二叉树、网格等问题时,使用就比较困难,而是用递归就能省掉人工思考解法的过程,只需要不断的将问题分解直到返回就可以了。...例如:for,while循环 两者关系:所有的迭代可以转换为递归,但递归不一定可以转换成迭代。...a.代码难理解; b.代码不如递归代码简洁; c.编写复杂问题时,代码逻辑不易想出 两者关系 a.递归中一定有迭代,但是迭代中不一定有递归;大部分可以相互转换。

    69220

    用递归的思想实现二叉树前、中、后序迭代遍历

    (参数、局部变量、返回地址等等)。...此时的调用栈如图所示: ? 为什么要说这个呢?因为递归遍历的执行过程就是这样的,只不过是函数不停的调用自身,直到遇到递归出口(终止条件)。...理解了递归调用栈的情况,再来看看怎么利用递归思想实现前序迭代遍历: function preorderTraversal(root) { const result = [] // 用一个数组...弹出节点 4 并从它的右子节点开始新的循环 由于节点 4 的右子节点为空,所以不会进入 while 循环,然后弹出节点 4 的父节点 2 再从节点 2 的右子节点开始循环 看到这是不是已经发现了这个迭代遍历的过程和递归遍历的过程一模一样...而且用递归的思想来实现迭代遍历,优点在于好理解,以后再遇到这种问题马上就能想起来怎么做了。 中序遍历 中序遍历和前序遍历差不多,区别在于节点出栈时,才将节点的值推入到 result 中。

    84650

    【C++】STL 容器 - vector 动态数组容器 ⑥ ( 使用迭代器遍历 vector 容器步骤 | 获取指容器向首元素的迭代器 begin 函数 | 获取末尾迭代器 | * 迭代器解引用 )

    一、 使用迭代器遍历 vector 容器步骤 1、使用迭代器遍历 vector 容器的步骤 使用 迭代器 遍历 vector 容器 , 首先 , 获取 起始范围 迭代器 , std::vector的 end() 函数 , 可获取 指向容器中 最后一个元素的迭代器 , 判断当前的迭代器值 是否等于 最后一个元素的迭代器值 , 如果 不等于 继续迭代 , 如果等于 停止迭代 ; it !...= vec.end(); 2、代码示例 - 使用迭代器遍历 vector 容器 代码示例 : #include "iostream" using namespace std; #include "vector...vec.size(); i++) { std::cout << vec[i] << ' '; } std::cout << std::endl; // 通过迭代器遍历数组...const noexcept; 上述两个函数都返回一个指向 容器中 最后一个元素 之后一个位置的迭代器 , 返回的迭代器 不指向任何有效的元素 , 但可以被用于比较和遍历容器的末尾 ; 特别注意 :

    3.7K10
    领券