树的遍历与图的遍历

  研发时候,不要受原来的术语的影响,其实就是想着原来学过的或者看过的可以解决新遇到的问题,这其实是侥幸心理,忘记原来的术语吧,那只是你创新的源泉。

  遍历就是把节点按一定规则构成一个线性序列,不同的规则得到不同顺序的线性序列,仅此而已 。

算法是实际问题工作步骤的抽象,不要一味想算法,想想实际情况怎么做的,然后提取算法,然后优化。

不论怎样,要和具体的数据结构结合在一起。

一、树的遍历

  对于树的遍历,有三种,就拿前序遍历来说,得到的序列不论怎么拆分(子串,就是要连续),始

终要是根左右,跟在左右前面,左在右前面,有点DP类似最优子结构。

//中序 LDR
if(null)
{
    return ;
}
else
{
    //分别输出左 根  右
}

  无论前中后都是dfs,不过树的话,由于有了明确的children字段,不需要设置vis数组来确保只遍历一次,因为肯定知识便利了一次。

travel(node)
{
    for(i=1:lengh)
    {
        //.....处理node节点
      if(null!=children)
          travel(children);
    }
}
另一种写法是把for循环写在函数外面

  树的层次遍历和BFS就很像了,总的来说就是DFS用栈,只不是栈是隐式栈,BFS用队列,用的是显式列。

1.初始化一个队列,根入队
2.取对头,并访问
3.若左节点非空,入队;右节点非空入队
4.队不空,循环2 - 3,否则结束

二、图的遍历

2.1 BFS

  自上而下,从左到右,也需要vis。是树层次的推广。

2.2 DFS

  需要vis数组。是树的先跟的推广。

2.3 树和图区别与联系

  图需要需要vis是怕循环遍历,这和树不一样,数不可能循环遍历。

  相同点:从一点出发遍历相邻节点,对树来说是左右孩子。

  不同点:图有多个相邻点,二叉树只有左右孩子,bfs需要vis记录访问过的节点。

  比如a,左b右c,访问a,然后bc如队,然后访问b,a和b相邻,没有vis的话a又要被访问。

  图有不连通情况,树的的dfs和bfs都不需要vis。

  树是一种特殊的图。

三、线索树

  每个节点增加2个字段分别指向节点的前驱和后继。前驱好搞,直接在travel增加一个参数parentID,初始为null,在for内,if外直接指向该parentID,后继应该也不难,在if内,主要要看树的数据结构。

四、非递归遍历

  BFS利用队列保存尚未遍历的节点或者子树,DFS用栈。

时间: 2024-10-24 08:01:34

树的遍历与图的遍历的相关文章

树的基础(图的遍历)

遍历即将树的所有结点访问且仅访问一次. 按照根节点位置的不同分为前序遍历,中序遍历,后序遍历. 一:前序遍历 1. 访问根结点: 2. 遍历左子树: 3. 遍历右子树. 二:中序遍历 1. 遍历左子树: 2. 访问根结点: 3. 遍历右子树. 三:后续遍历 1. 遍历左子树: 2. 遍历右子树: 3. 访问根结点. 求下图的三种遍历 前序遍历:A B C D E F 中序遍历:B C A E D F 后序遍历:B C D E F A 已知前序和中序遍历,求后序遍历: #include <bits

41 蛤蟆的数据结构笔记之四十一图的遍历之深度优先

41  蛤蟆的数据结构笔记之四十一图的遍历之深度优先 本篇名言:"对于我来说 , 生命的意义在于设身处地替人着想 , 忧他人之忧 , 乐他人之乐. -- 爱因斯坦" 上篇我们实现了图的邻接多重表表示图,以及深度遍历和广度遍历的代码,这次我们先来看下图的深度遍历. 欢迎转载,转载请标明出处: 1.  原理 图遍历又称图的遍历,属于数据结构中的内容.指的是从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次.图的遍历操作和树的遍历操作功能相似.图的遍历是图的一种基本操作,图的许多其它

C#与数据结构--图的遍历

C#与数据结构--图的遍历 8.2 图的存储结构 图 的存储结构除了要存储图中各个顶点的本身的信息外,同时还要存储顶点与顶点之间的所有关系(边的信息),因此,图的结构比较复杂,很难以数据元素在存储区 中的物理位置来表示元素之间的关系,但也正是由于其任意的特性,故物理表示方法很多.常用的图的存储结构有邻接矩阵.邻接表.十字链表和邻接多重表. 8.2.1  邻接矩阵表示法 对于一个具有n个顶点的图,可以使用n*n的矩阵(二维数组)来表示它们间的邻接关系.图8.10和图8.11中,矩阵A(i,j)=1

浅析数据结构-图的遍历

上一篇了解图的基本概念,包括图的分类.术语以及存储结构.本篇就是应用图的存储结构,将图进行数据抽象化,应用遍历方法,对数据进行遍历.由于图复杂的数据结构,一定保证图中所有顶点被遍历.如果只访问图的顶点而不关注边的信息,那么图的遍历十分简单,使用一个foreach语句遍历存放顶点信息的数组即可.但是,如果为了实现特定算法,就必须要根据边的信息按照一定的顺序进行遍历.图的遍历算法是求解图的连通性问题.拓扑排序和求解关键路径等算法的基础. 一.图的遍历   图的数据结构相对树复杂,图的任一顶点都可能和

图的遍历(一)—深度优先遍历

图就是由一些顶点和连接这些顶点的边组成的. 例如上图就是由5个顶点(1.2.3.4.5)和5条边(1-2.1-3.1-5.2-4.3-5)组成. 我们从1号顶点开始遍历这个图,遍历就是把图的每一个顶点都访问依次. 深度优先遍历的结果: 遍历顺序为: 深度优先遍历的思想: 首先以一个未被访问过的顶点作为起始顶点,沿着当前顶点的边走位未访问过的顶点:当没有未访问过的顶点时,则回到上一个顶点,继续试探访问别的顶点,直到所有的顶点都被访问过. 沿着图的某一个分支遍历直到末端,然后回溯,再沿着另一条进行同

树遍历以及图遍历的方法

树遍历: 根节点=D=Degree  左节点=L=Left  右节点=R=Right 1.前序遍历(DLR) 2.中序遍历(LDR) 3.后序遍历(LRD) 4.层次遍历(一层一层的遍历) 前三种遍历均可用递归或者非递归的方式来遍历. 层次遍历可以设一个队列,把元素放在队列里,每次输出队头元素. 图遍历: 1.广度优先遍历 也称为广度优先搜索(BFS)(类似于树的层次遍历) 2.深度优先遍历 也称为深度优先搜索(DFS) (类似于树的前序遍历) 这两种遍历均可用来判断图的连通性. 原文地址:ht

算法导论--图的遍历(DFS与BFS)

转载请注明出处:勿在浮沙筑高台http://blog.csdn.net/luoshixian099/article/details/51897538 图的遍历就是从图中的某个顶点出发,按某种方法对图中的所有顶点访问且仅访问一次.为了保证图中的顶点在遍历过程中仅访问一次,要为每一个顶点设置一个访问标志.通常有两种方法:深度优先搜索(DFS)和广度优先搜索(BFS).这两种算法对有向图与无向图均适用. 以下面无向图为例: 1.深度优先搜索(DFS) 基本步骤: 1.从图中某个顶点v0出发,首先访问v

图的遍历总结

概念 图的遍历有两种遍历方式:深度优先遍历(depth-first search)和广度优先遍历(breadth-first search). 1.深度优先遍历 基本思路:首先从图中某个顶点V0出发,然后依次从V0相邻的顶点出发深度优先遍历,直至图中所有与V0路径相通的顶点都被访问了:若此时尚有顶点未被访问,则从中选一个顶点作为起始点,重复上述过程,直到所有的顶点都被访问.可以看出深度优先遍历是一个递归的过程. 如下图中的一个无向图: 其深度优先遍历得到的序列为: 0->1->3->7-

数据结构快速回顾——图的遍历

图的遍历指的是从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次.图的遍历操作和树的遍历操作功能相似.图的遍历是图的一种基本操作,图的许多其它操作都是建立在遍历操作的基础之上. 图的遍历方法目前有深度优先搜索法和广度(宽度)优先搜索法两种算法. 深度优先搜索法DFS 深度优先搜索法的基本思想是:从图G的某个顶点v0出发,访问v0,然后选择一个与v0相邻且没被访问过的顶点vi访问,再从vi出发选择一个与vi相邻且未被访问的顶点vj进行访问,依次继续.如果当前被访问过的顶点的所有邻接顶点都已