树的遍历与图的遍历

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

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

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

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

一、树的遍历

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

终要是根左右,跟在左右前面,左在右前面,有点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-09-02 20:35:52

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

python 回溯法 子集树模板 系列 —— 8、图的遍历

问题 一个图: A --> B A --> C B --> C B --> D B --> E C --> A C --> D D --> C E --> F F --> C F --> D 从图中的一个节点E出发,不重复地经过所有其它节点后,回到出发节点E,称为一条路径.请找出所有可能的路径. 分析 将这个图可视化如下: 本问题涉及到图,那首先要考虑图用那种存储结构表示.邻接矩阵.邻接表....都不太熟. 百度一下,在这里发现了一个最爱.

[非原创]树和图的遍历

       备注:本文使用的范例代码来自<系统设计师教程>(王春森主编),本文性质属于我的对引用代码的注释和分析,因此并非原创.本文的部分先发表于中国编程论坛.   (一)用栈前序遍历树   对这篇文章的来源性说明:理论和代码来源,<系统设计师教程>(王春森主编),文章内容来自我对书中代码的分析和手工注释. ( 本文献给小师妹:littlehead(我是大好人)) 名词:栈,遍历,前序遍历,树. (1)准备:树的定义省略.但是由于数的定义属于递归型定义,即树的每个子节点又是一棵树

树与森林的存储、遍历和树与森林的转换

树的存储结构     双亲表示法   孩子表示法: (a)多重链表(链表中每个指针指向一棵子树的根结点); (b)把每个跟结点的孩子结点排列起来,看成一个线性表,且以单链表做存储结构.且N个头指针也组成一个线性表.   孩子兄弟表示法://二叉树表示法或二叉链表表示法 以二叉链表做树的存储结构,链表中结点的两个链域分别指向该结点的第一个孩子结点和下一个兄弟结点(fchild 和nsibling) //孩子兄弟表示法 typedef struct CSNode{ int data; CSNode

编程c语言-c语言版的数据结构中求图的遍历

问题描述 c语言版的数据结构中求图的遍历 调试时为什么会出现已停止工作??具体情况是出现了一个问题,导致程序停止正常工作,如果有可用的解决方案,Windiws将关闭程序并通知你 解决方案 贴出你的代码.代码是调试才能发现错误的.哪有看代码看出错误的. 你自己也要学会调试. 解决方案二: 数据结构(C语言版)规范代码之图(邻接多重表遍历)数据结构(C语言版)摘录--树和二叉树数据结构(C语言版)摘录--图 解决方案三: 看着真费劲.有malloc申请内存,没看到有free呢.

图的遍历-(深度优先&amp;amp;广度优先)

1.调用代码入口: using System; namespace 图_图的遍历 { internal class Program { private static void Main(string[] args) { var a = new AdjacencyList<char>(); Console.WriteLine("1.初始化树结构:"); Console.WriteLine("================================="

图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)

图的遍历的定义: 从图的某个顶点出发访问遍图中所有顶点,且每个顶点仅被访问一次.(连通图与非连通图) 深度优先遍历(DFS): 1.访问指定的起始顶点: 2.若当前访问的顶点的邻接顶点有未被访问的,则任选一个访问之:反之,退回到最近访问过的顶点:直到与起始顶点相通的全部顶点都访问完毕: 3.若此时图中尚有顶点未被访问,则再选其中一个顶点作为起始顶点并访问之,转 2: 反之,遍历结束.  连通图的深度优先遍历类似于树的先根遍历 如何判别V的邻接点是否被访问? 解决办法:为每个顶点设立一个"访问标志

关于返回值的问题(图的遍历),求解答啊

问题描述 关于返回值的问题(图的遍历),求解答啊 关于词语接龙,能否把所有的单词首尾连接起来(串成一条线即可,不需要围成环) 2 6 aloha arachnid dog gopher rat tiger 3 oak maple elm 为什么返回值是0:而不是 n..第一个完全可以首尾相连啊.求解答啊不会贴代码..就在这个里面 解决方案 find()函数是递归啊!最后一层的确返回了n,但是被你直接抛弃了啊!!你printf()打印的是第一层调用的返回值啊!!! 解决方案二: 说实话,关于递归我

C#语言中如何用邻接矩阵法表示图,并且遍历图?数据结构中图的遍历用C#的实现?

问题描述 C#语言中如何用邻接矩阵法表示图,并且遍历图?数据结构中图的遍历用C#的实现? C#语言中如何用邻接矩阵法表示图,并且遍历图?数据结构中图的遍历用C#的实现? 解决方案 http://download.csdn.net/download/yejinfu/2463153

数据结构实践——迷宫问题之图深度优先遍历解法

本文是针对[数据结构基础系列(7):图]的实践项目. [项目 - 迷宫问题之图深度优先遍历解法] 设计一个程序,采用深度优先遍历算法的思路,解决迷宫问题. (1)建立迷宫对应的图数据结构,并建立其邻接表表示. (2)采用深度优先遍历的思路设计算法,输出从入口(1,1)点到出口(M,N)的所有迷宫路径. [模型建立] 将迷宫中的每一格作为一个顶点,相邻格子可以到达,则对应的顶点之间存在边相连. 例如,下面的迷宫 在使用数组表示时,用0表示格子是空地,用1表示格子处是墙,对应的矩阵是: int mg