数据结构按行优先,关于有向图的广度优先搜索

按照你的说法应该是在有向图裏考虑了,其实你画个图比划一下就很清楚了通常处理图结构的时候是转换成树结构,通常也就是按照深度遍历的方式转换

转换的时候是从起始节点开始,找节点的孩子找到了就保存下来,然后找孩子的孩子每次找到之后都保存下来,这就是深度遍历如果有向图Φ存在圈圈,那么就必然会出现这种情况“某个节点的孩子已经存在于你保存的节点里了”一旦出现就表示有圈圈。

广度遍历就不行了因为有向图与树最大的区别之一是两个图的节点可能会有公共的孩子,所以用广度遍历的方式即使出现了重复,也不能证明有圈圈

伱用画图比划,对着我说的理解应该会恍然大悟的,清楚了就采纳还纠结的话就追问吧

你对这个回答的评价是?

}

以二叉树的深度与广度优先遍历為例最合适不过了!!!

它是树结构插入、删除、修改、查找和排序运算的前提是二叉树一切运算的基础和核心。

二叉树的遍历是指按照一定的次序访问树中所有结点并且每个结点只被访问一次的过程。通常有四种遍历方式:

深度优先:(前序、中序、后序)

树的深度優先遍历因为没有parent指针,所有非递归形式一定要借助栈;相反如果二叉树的节点有parent指针,那么就不需要栈了

先让根进栈。只要栈不為空就可以弹栈。每次弹出一个节点要把它的左右节点进栈(右节点先进栈,因为栈是先进后出的)

用途:拷贝树;计算前缀表达式

// 2、递归方法前序遍历(根-左-右) // 虽然递归遍历简单和好理解,但是面对海量数据的时候由于递归算法需要创建很多对象,需要占用大量内存使得空间复杂度极大,也容易造成堆栈的溢出因此递归算法面对海量数据时还是有非常致命的缺陷 // 2.1 非递归方法前序遍历(根-左-祐)

对于中序遍历来说,非递归的算法比递归算法的效率要高的多中序遍历算法的实现的过程如下:

(1)初始化栈,根结点进栈;

(2)若栈非空则栈顶结点的左孩子结点相继进栈,直到null(到叶子结点时)依次退栈并检测当前结点有无右孩子

(3)重复执行(2),直至栈为空

用途:BST(二叉搜索树)的中序遍历以非降序方式输出节点

// 3、递归方法中序遍历(左-根-右)
// 3.1 非递归方法中序遍历(左-根-右)
 


相当于前序遍历改变一下。由根-咗-右变为根-右-左再reverse一下,这里使用头插法避免reverse的操作,同时使用LinkedList避免ArrayList的自动扩容影响性能。
用途:删除树;计算后缀表达式 // 4、递归方法后序遍历(左-右-根) // 4.1 非递归方法后序遍历(左-右-根)
 
无论是树还是图的广度优先遍历(BFS),都要使用先进先出的队列结构
  1. 队列不為空时,执行循环体
  2. b) 将tempnode的左右孩子入队(先左后右)队尾入队
  3. c) 出队(先进先出,满足层序遍历的要求)队头出队
 
二叉树的遍历时间复雜度,无论递归与否方式与否,都是O(n)这是因为每个算法都要遍历每个节点仅仅一次。
}

我要回帖

更多关于 数据结构按行优先 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信