树的遍历与图的遍历

简介:   研发时候,不要受原来的术语的影响,其实就是想着原来学过的或者看过的可以解决新遇到的问题,这其实是侥幸心理,忘记原来的术语吧,那只是你创新的源泉。   遍历就是把节点按一定规则构成一个线性序列,不同的规则得到不同顺序的线性序列,仅此而已 。

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

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

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

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

一、树的遍历

  对于树的遍历,有三种,就拿前序遍历来说,得到的序列不论怎么拆分(子串,就是要连续),始
终要是根左右,跟在左右前面,左在右前面,有点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用栈。

目录
相关文章
|
7月前
|
存储 人工智能 算法
图与树的遍历:探索广度优先、深度优先及其他遍历算法的原理与实现
图与树的遍历:探索广度优先、深度优先及其他遍历算法的原理与实现
445 0
|
1月前
|
算法
树的遍历算法有哪些?
不同的遍历算法适用于不同的应用场景。深度优先搜索常用于搜索、路径查找等问题;广度优先搜索则在图的最短路径、层次相关的问题中较为常用;而二叉搜索树的遍历在数据排序、查找等方面有重要应用。
31 2
|
7月前
|
存储 算法
深度优先搜索遍历与广度优先搜索遍历
深度优先搜索遍历与广度优先搜索遍历
54 3
|
6月前
|
算法
数据结构和算法学习记录——层序遍历(层次遍历)、二叉树遍历的应用(输出二叉树中的叶节点、求二叉树的高度、二元运算表达式树及其遍历、由两种遍历序列确定二叉树)
数据结构和算法学习记录——层序遍历(层次遍历)、二叉树遍历的应用(输出二叉树中的叶节点、求二叉树的高度、二元运算表达式树及其遍历、由两种遍历序列确定二叉树)
60 0
|
7月前
|
算法 测试技术 C#
【深度优先搜索】1766. 互质树
【深度优先搜索】1766. 互质树
|
7月前
|
算法 索引
邻接矩阵表示 深度遍历 广度遍历
邻接矩阵表示 深度遍历 广度遍历
37 0
|
7月前
|
算法
树的深度优先和广度优先
树的深度优先和广度优先
45 0
|
存储 编译器
二叉树的递归遍历与迭代遍历(图示)
本文将讲述二叉树递归与迭代的相关知识。
133 0
|
算法
算法系列-多叉树的遍历
在内卷潮流的席卷下,身为算法小白的我不得不问自己,是否得踏上征程,征服这座巍巍高山。 从零开始,终点不知何方,取决于自己可以坚持多久。 希望你可以和我一样,克服恐惧,哪怕毫无基础,哪怕天生愚钝,依然选择直面困难。