二叉树的前中后序递归和非递归遍历操作【代码】

“遍历”是二叉树各种操作的基础,可以在遍历过程中对节点进行各种操作,如:求节点的双亲,求节点的孩子,判断节点的层次,当然,还有一些更重要的操作,例如,依据遍历序列建立二叉树,,再如,对建立的二叉树进行线索化,等等。

二叉树的各种遍历操作必须了然于心,无论是递归的,还是非递归的。递归算法的优点是形式简单,当然,正如一句话所说“迭代是人,递归是神。”递归算法的整个详细过程还是很烧脑的,每一步都把未知当作已知,每一步又在把未知变为已知。想不到描述起来又用上了递归的概念,生活中其实有很多递归的现象,我印象最深的就是两面面对面放置的镜子,你永远也找不到最深处的自己(当然我们假设你的视力无限好同时光在反射过程中没有亮度损失),也就是说这个递归过程没有边界条件,会无限递归,永远也不会返回,这在程序中可就是死循环呀,相当可怕,CPU很快就会被掏空。所以每次设计递归算法时,首先要考虑到的就是边界返回条件。还有一个我印象很深的电影,《盗梦空间》,三层梦境,从现实中进入第一层,再从第一层梦境进入第二层,最后再从第二层进入第三层。当然电影里也说了可以无限往下递归,进入一个叫迷失域的地方,不过好在电影的设定是无论你掉入了多深的梦,你只要在梦里死了,就能返回上层梦境,也就是说,每层梦境都有一个返回条件,所以原则上是不会死循环的。。。

哎呀,扯太远了,其实我一直想写一篇关于递归的哲学文章,阐述程序和我们现实的联系,算了,不扯了。

递归形式上很简单,代码很简洁,然后时间复杂度却很大,同时还得花费一定的空间复杂度(栈递归深度),比如经典的Hanoi问题,时间复杂度是O(2^n),n为圆盘的个数,时间复杂度膨胀的很厉害。所以我们在很多时候不能依赖于递归算法,而需要去寻找相应的非递归算法。比如计算一个数的阶乘,递归算法

原文地址:https://www.cnblogs.com/journal-of-xjx/p/9315155.html

时间: 2024-10-29 19:07:46

二叉树的前中后序递归和非递归遍历操作【代码】的相关文章

【算法导论】二叉树的前中后序非递归遍历实现

二叉树的递归遍历实现起来比较简单,而且代码简洁:而非递归遍历则不那么简单,我们需要利用另一种数据结构---栈来实现.二叉树的遍历又可以分为前序.中序和后序三种,它们是按照根结点在遍历时的位置划分的,前序遍历则根结点先被遍历,中序则根结点在左右叶子节点之间被遍历,后序则是根结点最后被遍历.三种非递归遍历中,前序和中序都不是太复制,而后序遍历则相对较难. 一.前序遍历 我们这里前序遍历按照"根-左-右"的顺序来遍历.这里按照"递归--非递归"的次序来研究,之后的几种亦是

二叉树的前中后序遍历简单的递归

二叉树的遍历 无外乎广度和深度 其中深度又分为前中后序遍历三种情况  这三种遍历若只是递归方法 自然很是简单 但递归代码简单 若嵌套层次太深 会栈溢出 二叉树节点数据结构: struct Binary_node{    int val;    Binary_node *left;    Binary_node *right;    Binary_node(int v = 0, Binary_node *le = nullptr, Binary_node *ri = nullptr) :val(v

二叉树的前中后序遍历

#include<stdio.h> #include<string.h> #include<stdlib.h> #define Size 100 #define Resize 10 typedef struct Bitnode{ //定义结点 char data; struct Bitnode *lchild,*rchild; }Bitnode,*Bitree; typedef struct Stack{ //定义栈 Bitree *base; int top; int

二叉树系列 - 二叉树的前/中/后序遍历(非递归)

二叉树的遍历是二叉树中最最基础的部分. 这里整理二叉树不用递归实现三种顺序遍历的方式. 不用递归的话,一般需要栈来完成.当然线索二叉树(不需要栈或递归)也可以完成中序遍历,这种方式在这篇文章中已经讨论过.这里着重讨论使用栈的实现方式. 中序遍历 (1) 双while,第二个内层while是为了不断压入left child. vector<int> inorderTraversal(TreeNode *root) { vector<int> v; if(!root) return v

POJ 2255 Tree Recovery &amp;&amp; Ulm Local 1997 Tree Recovery (二叉树的前中后序遍历)

链接:poj.org/problem?id=2255 题意: 分别给你一个二叉树的前序遍历序列和中序遍历序列,让你给出这个二叉树的后序遍历序列. 思路: 对于二叉树的三种遍历方式,都可以使用递归来实现,那么也一定可以使用递归来拆解,以达到从遍历序列确定二叉树具体结构的目的.对于前序遍历来说,第一个字母一定是根,并且在序列中根的左子树包含的点一定出现在根的右子树的前面.对于中序遍历序列来说,根前面出现的字母所代表的点一定出现在左子树中,根后面出现的字母所代表的点一定出现在右子树中.在根据前序与中序

二叉树的前中后序遍历迭代&amp;广度遍历

递归很是简单 但也应该掌握其迭代方式的遍历方法 这三种的迭代遍历方法需要通过栈来存储节点 尤其是后序遍历还需要 记录当前节点的右子树是否已被遍历 决定是否遍历当前节点 而其广度遍历 只需要一个队列来顺序记录遍历节点 即可轻松解决问题  主要思想在程序代码中来做说明 前序遍历:遍历结果返回一个vector容器中 std::vector<int> BinaryTree::pre_order_iter(Binary_node *root){    std::vector<int> res

Binary Tree Traversal 二叉树的前中后序遍历

[抄题]: [思维问题]: 不会递归.三要素:下定义.拆分问题(eg root-root.left).终止条件 [一句话思路]: [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入): [画图]: [一刷]: [二刷]: [三刷]: [四刷]: [五刷]: [总结]: [复杂度]:Time complexity: O() Space complexity: O() [英文数据结构,为什么不用别的数据结构]: [其他解法]: [Follow Up]: [L

前中后序建立树或者直接历遍

前中后序建立树或者直接历遍 代码实现 void postOrder(int root,int start,int end) { if (start > end) return; int index = start; while (inOrder[index] != preOrder[root] ) index++; postOrder(root + 1, start, index - 1); postOrder(root + index - start + 1, index + 1, end);

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

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 写在前面: 最近准备找工作,捡起原来学习过的各种知识,加上一些自己的理解,梳理一下流程,巩固自己的认识,一步两步,一步两步... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 二叉树的遍历是树操作的基础,一般的前中后序递归遍历比较简单,这里就不列出了,主要是非递归实