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

遍历--的广度遍历(层次遍历),深度遍历(前序遍历遍历,后序遍历递归和非递归实现)

递归很好理解就是非递归...debug几次,细心点就好了 ps. 广度遍历叫层次遍历,一层一层的来就简单了。...前序遍历遍历,后序遍历的区别就是根在前(根左右),根(左根右),根在后(左右根) 最后补全所有源码 二 广度优先遍历 层次遍历 //广度优先遍历 层次遍历 public...subTree.leftChild); visted(subTree); inOrder(subTree.rightChild); } } //遍历的非递归实现...= null) { //递归左子树搜索 return p; } else { //递归右子树搜索...bt.nonRecPreOrder(bt.root); System.out.println("***非递归实现****(遍历)遍历*****************");

4.6K40

递归遍历

先序非递归遍历二叉序非递归遍历二叉,后序非递归遍历二叉及双栈法。...先序非递归遍历二叉 先序非递归遍历比较简单,感觉与DFS类似,根据先序遍历的规则根左右,先将根节点压入栈,然后遍历左子树,再遍历左子树的左子树,一头走到NULL,把每次遍历的左子树的根节点依次入栈并把当前结点数据打印出来...//7 4 2 8 9 5 6 3 1 // 后序 序非递归遍历二叉 仔细看代码你会发现,先序遍历遍历代码差不多,关键在于打印节点数据的位置不一样。...i<n;++i) { scanf("%d",&b[i]); } Tree = Creat(a,b,n); travel_in(Tree); } return 0; } 后序非递归遍历二叉及双栈法...单栈法 后序非递归遍历和先序序非递归开始类似,先将左子树的左孩子的的左孩子的….每个节点压入栈。

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

的非递归遍历

使用递归遍历非常方便,如果将代码拉伸开来,我们能否是否非递归代码来实现呢?当然是可以的,我们只要把递归的循环步骤修改为while就可以了。...并放弃其左子树; 如果结点没有左子树,访问该结点; 步骤2: 如果结点有右子树,重复步骤1; 如果结点没有右子树(结点访问完毕),根据栈顶指示回退,访问栈顶元素,并访问右子树,重复步骤1 如果栈为空,表示遍历结束...TirTNode* findLeft(TirTNode* tree, std::stack& st) { if (nullptr == tree) return nullptr; // 持续遍历...= pLeft->rightChild) { // 如果有,则遍历这个树下最深的左子树 pLeft = findLeft(pLeft->rightChild, st); } else //如果节点没有右子树...函数内部会自动打印出每个节点的内容。 myTreeOrder(&treeA);

16220

二叉的前、、后遍历(递归递归)

二叉遍历 二叉的前序遍历 访问根结点,先序遍历左子树,先序遍历右子树 遍历基本步骤为先根结点,然后左子树,然后右子树, 需要注意的是这个遍历需要类似于递归访问完A以后,需要去访问B,这时,需要把...B当做一个根结点,下一次应该去访问D而不是C,只到访问到G即叶子节点以后才会递归的往回访问,所有节点都可以看作为父节点,叶子节点可以看做两个孩子为空的父节点 二叉遍历 遍历左子树,访问根结点...,遍历右子树 二叉的后续遍历 后续遍历左子树,后续遍历右子树,访问根结点。...、、后遍历递归遍历) 存储结构 class Node { public Node left; public Node right; public String data;...System.out.print(node.data); preOrder(node.left); preOrder(node.right); } } 二叉遍历

92600

递归方式实现二叉后序遍历_二叉递归遍历

二叉树前序遍历 对于一种数据结构而言,我们最常见的就是遍历,那么关于二叉我们该如何去遍历呢? 请看大屏幕 。。。。...上图是一棵二叉,前序遍历结果:1 2 4 5 3 6 咦,我想你可能会疑惑什么叫做前序遍历,其实很简单,就是按照 根 -》 左 -》 右 的方式去遍历二叉。...首先让我们来看看如何递归的去前序遍历二叉 注:在这里我特别强调一点,我们二叉,如果采用递归的方式,大部分都采用的根左右的方式,即采用子问题的方式,即先处理跟节点,再处理左子树,再处理右子树的这样一种思想...前序递归遍历 /** * Definition for a binary tree node...那么接下来我们再看看非递归的方式 前序非递归遍历 /** * Definition for a binary tree node.

38210

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

二 叉是一种非常重要的数据结构,很多其它数据结构都是基于二叉的基础演变而来的。对于二叉,有前序、序以及后序三种遍历方法。...因为的定义本身就是 递归定义,因此采用递归的方法去实现的三种遍历不仅容易理解而且代码很简洁。而对于遍历若采用非递归的方法,就要采用栈去模拟实现。...在三种遍历, 前序和遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。 一.前序遍历    前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。  ...因为在后序遍历,要保证左孩子和右孩子都已被访问并且左孩子右孩子前访问才能访问根结点,这就为流程的控制带来了难题。下面介绍两种思路。      ...可以看出,在这个过程,每个结点都两次出现在栈顶,只有第二次出现在栈顶时,才能访问它。因此需要多设置一个变量标识该结点是 否是第一次出现在栈顶。

1.5K100

二叉遍历算法递归实现+层次遍历

; struct BTNode *rchild; }BTNode; 二叉遍历算法 1 先序遍历 先序遍历的操作如下。...如果二叉为空,则什么都不做;否则: 1)访问根节点 2)先序遍历左子树 3)先序遍历右子树 描述如下: void preorder(BTNode *p) { if(p !...(p->rchild); //先序遍历右子树 } } 2 遍历 遍历的操作如下。...如果二叉为空,则什么都不做;否则: 1)遍历左子树 2)访问根节点 3)遍历右子树 描述如下: void inorder(BTNode *p) { if(p !..." /> 上图所示为二叉的层次遍历,即按照箭头所指方向,按照1、2、3、4的层次顺序,对二叉各个结点进行访问(此图反映的是自左至右的层次遍历,自右至左的方式类似) 要进行层次遍历,需要建立一个循环队列先将二叉头结点入队列

1.4K00

递归遍历-LeetCode 124、112、113(递归遍历二叉,回溯法)

【LeetCode #124 二叉的最大路径和】 给定一个非空二叉,返回其最大路径和。 本题中,路径被定义为一条从任意节点出发,达到任意节点的序列。...因此使用递归算法从根节点开始遍历,如果左右子树最大路径和大于0,则取出该路径的最大值,否则为零,也就是说如果大于零,则加上之后result是可以增加的!...解题思路: 这是一个分治思路,求一个二叉存不存在某一个路径和为sum,可以变换问题为: 对于一个节点root, 如果其左子树存在,则其左子树存不存在一个路径和为sum-root->val, 如果其右子树存在...解题思路: 和上一题的思路一模一样,但这一题需要我们将中间遍历的节点值保存起来,因此需要一个tmp数组来保存我们遍历过的节点!...这里面需要注意的一点就是回溯法的使用,当修改了一个状态之后,递归结束后,需要把这个状态重新置为之前的状态。 比如tmppush_back了一个值,当递归结束进行回溯阶段,需要pop_back()。

87970

二叉—层序、前序序后序(递归、非递归)遍历详解

前言 前面介绍了二叉排序的构造和基本方法的实现。但是排序遍历也是比较重要的一环。所以笔者将前后序.和层序遍历梳理一遍。 了解遍历,需要具有的只是储备有队列,递归,和栈。...三序遍历只是利用了递归中的来回过程不同片段截取输出,而达到前(、后序遍历的结果)。 前序递归 前序的规则就是根结点 ---> 左子树 ---> 右子树.我们调用递归前进行节点操作。...有了前序的经验,我们就很好利用递归实现遍历。...我们直到序排列的顺序是:左节点,根节点,右节点。那么我们经过根节点的前面节点 不能释放, 因为后面还需要用到它。所以要用栈先储存。 它的规则大致为: 栈依次存入左节点所有点,直到最左侧栈顶。...法1(传统方法) 在前面的前序和序先到最左侧压入栈的时候,两种顺序依次是 前序: 入栈——>左入栈——>左出栈——>中出栈——>右入栈——>右孩子入出——>右出栈 入栈时候操作即可前序 序: 入栈

4.1K10

二叉递归遍历

特点1 虽然是从root开始,但是 严重依赖从下到上的反馈的数据 ,例如求tree的高度 题目1 最近公共祖先(LCA) 给定一个二叉, 找到该两个指定节点的最近公共祖先。...Balanced Binary Tree 依赖下面反馈 合并在一起 特点2 从上到下,依赖当前root节点判断 1 翻转等价二叉 我们可以为二叉 T 定义一个翻转操作,如下所示:选择任意节点,然后交换它的左子树和右子树...只要经过一定次数的翻转操作后,能使 X 等于 Y,我们就称二叉 X 翻转等价于二叉 Y。 编写一个判断两个二叉是否是翻转等价的函数。...这些由根节点 root1 和 root2 给出 选择任意节点,然后交换它的左子树和右子树 左子树和右子树是否继续交换呢? 是否选择了任意节点?...翻转一棵二叉 root保持不变 左右子树交换 重复步骤1和2 测试 翻转一棵二叉 code class Solution { public: TreeNode* invertTree(TreeNode

51720

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

二 叉是一种非常重要的数据结构,很多其它数据结构都是基于二叉的基础演变而来的。对于二叉,有前序、序以及后序三种遍历方法。...因为的定义本身就是 递归定义,因此采用递归的方法去实现的三种遍历不仅容易理解而且代码很简洁。而对于遍历若采用非递归的方法,就要采用栈去模拟实现。...在三种遍历, 前序和遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。 一.前序遍历    前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。  ...因为在后序遍历,要保证左孩子和右孩子都已被访问并且左孩子右孩子前访问才能访问根结点,这就为流程的控制带来了难题。下面介绍两种思路。       ...; //求出x右子树的层号,返回该层号加1 int c2 = NodeLevel(BT->right , x); if(c2 >= 1) return c2+1; //左、右子树中都不存在

1.2K80

聊聊二叉遍历递归和非递归

二叉也是常用的数据结构,通过使用二叉可以快速的对数据进行排序或者查找,常用的堆排序算法,堆的底层实质就是一个模拟的完全二叉!等等,什么是完全二叉?二叉又是什么?有哪几类?...其类别为以下几种: 满二叉:所有的叶节点全部底层,并且底层全部铺满的二叉 完全二叉:叶节点只能出现在最后两层,并且最底层的叶节点都向左对齐 二叉搜索:要求每个节点本身大于其左子树,而小于其右子树...满二叉搜索 二叉遍历 ? 二叉遍历有三种方式:先序遍历遍历,后序遍历。思路很简单,这里面说的顺序的序是指每个子树根节点的遍历(打印)顺序。...递归版本(先、、后序) 递归版的遍历算法很简单了,我们只需要改变打印次序就好了,也没有什么可讲的!...(先、、后序) 首先我们要清楚,任何算法的递归版本都可以改成非递归版本,因为函数递归调用其实质就是压栈的过程,那么我们完全可以使用堆栈来模拟这个过程!

92530
领券