`
weihe6666
  • 浏览: 440406 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

二叉树的深度优先遍历、广度优先遍历和非递归遍历(转)

 
阅读更多
二叉树的深度优先遍历、广度优先遍历和非递归遍历

二叉树的遍历:

D:访问根结点,L:遍历根结点的左子树,R:遍历根结点的右子树。

给定一棵二叉树的前序遍历序列和中序遍历序列可以惟一确定一棵二叉树。

二叉树的深度优先遍历的非递归的通用做法是采用栈,广度优先遍历的非递归的通用做法是采用队列。

深度优先遍历二叉树。

1. 中序遍历(LDR)的递归算法:

若二叉树为空,则算法结束;否则:

    中序遍历根结点的左子树;

    访问根结点;

    中序遍历根结点的右子树。

2. 前序遍历(DLR)的递归算法:

若二叉树为空,则算法结束,否则:

    访问根结点;

    前序遍历根结点的左子树;

    前序遍历根结点的右子树。

3. 后序遍历(LRD)的递归算法:

若二叉树为空,则算法结束,否则:

    后序遍历根结点的左子树;

    后序遍历根结点的右子树;

    访问根结点。



广度优先遍历二叉树。

广度优先周游二叉树(层序遍历)是用队列来实现的,从二叉树的第一层(根结点)开始,自上至下逐层遍历;在同一层中,按照从左到右的顺序对结点逐一访问。

按照从根结点至叶结点、从左子树至右子树的次序访问二叉树的结点。算法:

    1初始化一个队列,并把根结点入列队;

    2当队列为非空时,循环执行步骤3到步骤5,否则执行6;

    3出队列取得一个结点,访问该结点;

    4若该结点的左子树为非空,则将该结点的左子树入队列;

    5若该结点的右子树为非空,则将该结点的右子树入队列;

    6结束。



非递归深度优先遍历二叉树。

栈是实现递归的最常用的结构,利用一个栈来记下尚待遍历的结点或子树,以备以后访问,可以将递归的深度优先遍历改为非递归的算法。

1. 非递归前序遍历:遇到一个结点,就访问该结点,并把此结点推入栈中,然后下降去遍历它的左子树。遍历完它的左子树后,从栈顶托出这个结点,并按照它的右链接指示的地址再去遍历该结点的右子树结构。

2. 非递归中序遍历:遇到一个结点,就把它推入栈中,并去遍历它的左子树。遍历完左子树后,从栈顶托出这个结点并访问之,然后按照它的右链接指示的地址再去遍历该结点的右子树。

3. 非递归后序遍历:遇到一个结点,把它推入栈中,遍历它的左子树。遍历结束后,还不能马上访问处于栈顶的该结点,而是要再按照它的右链接结构指示的地址去遍历该结点的右子树。遍历遍右子树后才能从栈顶托出该结点并访问之。另外,需要给栈中的每个元素加上一个特征位,以便当从栈顶托出一个结点时区别是从栈顶元素左边回来的(则要继续遍历右子树),还是从右边回来的(该结点的左、右子树均已周游)。特征为Left表示已进入该结点的左子树,将从左边回来;特征为Right表示已进入该结点的右子树,将从右边回来。

4. 简洁的非递归前序遍历:遇到一个结点,就访问该结点,并把此结点的非空右结点推入栈中,然后下降去遍历它的左子树。遍历完左子树后,从栈顶托出一个结点,并按照它的右链接指示的地址再去遍历该结点的右子树结构。

----------------------------------------------------------------------

    图的深度优先搜索法是树的先根遍历的推广,它的基本思想是:从图G的某个顶点v0出发,访问v0,然后选择一个与v0相邻且没被访问过的顶点vi访问,再从vi出发选择一个与vi相邻且未被访问的顶点vj进行访问,依次继续。如果当前被访问过的顶点的所有邻接顶点都已被访问,则退回到已被访问的顶点序列中最后一个拥有未被访问的相邻顶点的顶点w,从w出发按同样的方法向前遍历,直到图中所有顶点都被访问。
    图的广度优先搜索是树的按层次遍历的推广,它的基本思想是:首先访问初始点vi,并将其标记为已访问过,接着访问vi的所有未被访问过的邻接点vi1,vi2, …, vi t,并均标记已访问过,然后再按照vi1,vi2, …, vi t的次序,访问每一个顶点的所有未被访问过的邻接点,并均标记为已访问过,依次类推,直到图中所有和初始点vi有路径相通的顶点都被访问过为止。
分享到:
评论

相关推荐

    Graph1_非递归算法进行深度优先遍历和广度优先遍历_

    本话题主要探讨如何使用非递归算法对无向图进行深度优先遍历(DFS, Depth First Search)和广度优先遍历(BFS, Breadth First Search),这两种遍历方法在图算法中有着广泛的应用。 **1. 邻接表表示法** 在处理大...

    用Java实现二叉树的深度优先、广度优先遍历

    本篇文章将深入探讨如何使用Java来实现二叉树的深度优先遍历(DFS, Depth First Search)和广度优先遍历(BFS, Breadth First Search)。 **深度优先遍历** 是一种在图或树中搜索的方法,它尽可能深地探索树的分支...

    二叉树深度遍历广度遍历

    总之,掌握二叉树的深度遍历和广度遍历是理解和应用数据结构的关键。通过学习这些基本操作,可以更好地解决实际问题,例如在搜索、排序、图论等领域。在实际编程中,理解并灵活运用这些方法,能够提高代码的效率和...

    二叉树广度和深度优先遍历

    二叉树广度和深度优先遍历,通过递归算法实现二叉树的建立,利用递归算法实现深度优先遍历,使用队列实现广度优先遍历

    二叉树遍历的c++实现(递归和非递归深度优先遍历)

    深度优先遍历的实现; 广度优先遍历的实现;

    二叉树的深度优先搜索与广度优先搜索实现

    本文将详细介绍二叉树的深度优先搜索和广度优先搜索的非递归方法实现。 深度优先搜索的非递归方法实现: 深度优先搜索是一种遍历二叉树的方式,它沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点 v 的...

    二叉树深度、广度非递归

    二叉树深度优先遍历、广度优先遍历{非递归}

    图的遍历,包括深度优先和广度优先遍历

    在这个主题下,我们将深入探讨深度优先遍历(DFS, Depth First Search)和广度优先遍历(BFS, Breadth First Search),以及在树结构中常见的先序、中序和后序遍历。这些遍历方法各有其特点,适用于不同的问题场景。...

    二叉树递归遍历,非递归遍历,按层次遍历

    在实际应用中,二叉树遍历的方法选择取决于具体需求。例如,前序遍历适合构造和复制二叉树,中序遍历通常用于构造二叉搜索树,后序遍历可用于计算表达式树的结果。层次遍历则常用于显示树的层次结构,如在图形界面中...

    Java实现二叉树的深度优先遍历和广度优先遍历算法示例

    本文详细介绍了Java实现二叉树的深度优先遍历和广度优先遍历算法,通过实例代码展示了深度优先遍历和广度优先遍历的实现过程,并对二叉树的定义、深度优先遍历与广度优先遍历算法原理与相关操作实现技巧进行了详细...

    二叉树遍历广度优先

    本篇文章将重点关注广度优先搜索,即“二叉树遍历广度优先”。 广度优先搜索(BFS)是一种在图或树中寻找路径的算法,它从根节点开始,然后逐层地访问所有相邻节点。在二叉树中,这意味着从根节点开始,先访问所有...

    二叉树的先序,中序,后序递归,非递归遍历和广度优先遍历。

    二叉树的先序,中序,后序递归,非递归遍历和广度优先遍历。此程序是用C语言写的。

    js代码-二叉树广度优先遍历

    本篇文章将深入探讨如何使用JS进行二叉树的广度优先遍历(BFS)。 **一、二叉树的基础概念** 二叉树的基本元素是节点,每个节点包含三个部分:数据、左指针和右指针。在JS中,我们可以创建一个Node类来表示二叉树...

    c语言编写的二叉树深度优先遍历算法

    以下是使用C语言编写的二叉树的广度优先遍历(也称为层次遍历)算法的示例代码: #include #include // 定义二叉树的节点结构 typedef struct Node { int data; struct Node* left; struct Node* right; } ...

    树的深度优先遍历与广度优先遍历

    在计算机科学中,树是一种非线性数据结构,它由顶点(节点)和连接这些顶点的边组成。在处理树形结构时,遍历是...通过查看和学习这些文件,你可以更深入地了解如何在JavaScript环境下实现树的深度优先和广度优先遍历。

    图的深度、广度优先遍历(c语言).rar

    在这个压缩包中,包含了一个用C语言实现的程序,用于执行图的深度优先遍历(DFS, Depth-First Search)和广度优先遍历(BFS, Breadth-First Search)。以下是这两个遍历方法的详细解释: 1. **深度优先遍历(DFS)*...

    数据结构 图的深度优先遍历和广度优先遍历 .zip

    本资料包主要探讨的是图的两种经典遍历方法:深度优先遍历(DFS,Depth-First Search)和广度优先遍历(BFS,Breadth-First Search)。 深度优先遍历是一种用于遍历或搜索树或图的算法,其基本思想是从起点开始,尽...

    C++ 二叉树遍历(非递归版)

    在"traverse tree (nonrecuision)"这个压缩包文件中,很可能包含了用C++实现的非递归版本二叉树遍历代码,可以作为学习和参考的实例。通过理解并实践这些代码,可以加深对二叉树遍历的理解,提高编程能力。

    erchashubianli.rar_erchashubianli_二叉树 深度_二叉树遍历_遍历

    求解树的深度可以通过递归或者层次遍历(广度优先搜索)实现。递归方法从根节点出发,如果左右子树不存在,则深度为1;如果存在,则树的深度为左右子树深度的最大值加1。层次遍历则可以使用队列,每次从队列中取出一...

    二叉树的遍历:深度优先与广度优先.pdf

    ### 二叉树遍历详解:深度优先与广度优先 #### 一、深度优先遍历(Depth-First Search, DFS) **深度优先遍历**是遍历二叉树的一种方式,它首先深入到某个子树的底部,然后回溯到根节点,再转向另一个子树继续探索...

Global site tag (gtag.js) - Google Analytics