python实现图的遍历(递归和非递归)
class graph:
def __init__(self,value):
self.value=value
self.neighbors=None # 图的广度优先遍历
# 1.利用队列实现
# 2.从源节点开始依次按照宽度进队列,然后弹出
# 3.每弹出一个节点,就把该节点所有没有进过队列的邻接点放入队列
# 4.直到队列变空
from queue import Queue
def bfs(node):
if node is None:
return
queue = Queue()
nodeSet = set()
queue.put(node)
nodeSet.add(node)
while not queue.empty():
cur = queue.get() # 弹出元素
print(cur.value) # 打印元素值
for next in cur.neighbors: # 遍历元素的邻接节点
if next not in nodeSet: # 若邻接节点没有入过队,加入队列并登记
nodeSet.add(next)
queue.put(next) # 图的深度优先遍历(非递归)
# 1.利用栈实现
# 2.从源节点开始把节点按照深度放入栈,然后弹出
# 3.每弹出一个点,把该节点下一个没有进过栈的邻接点放入栈
# 4.直到栈变空
def dfs(node):
if node is None:
return
nodeSet = set()
stack = []
print(node.value)
nodeSet.add(node)
stack.append(node)
while len(stack) > 0:
cur = stack.pop() # 弹出最近入栈的节点
for next in cur.neighbors: # 遍历该节点的邻接节点
if next not in nodeSet: # 如果邻接节点不重复
stack.append(cur) # 把节点压入
stack.append(next) # 把邻接节点压入
nodeSet.add(next) # 登记节点
print(next.value) # 打印节点值
break # 退出,保持深度优先 def dfs1(node,nodeset):#递归深度优先遍历
if node is None:
return
print(node.value)
nodeset.add(node)
for next in node.neighbors:
if next not in nodeset:
dfs1(next, nodeset) node5=graph(5)
node4=graph(4)
node3=graph(3)
node2=graph(2)
node1=graph(1)
nodeset=set()
node4.neighbors=[node3,node2,node1]
node3.neighbors=[node4]
node2.neighbors=[node4,node5]
node1.neighbors=[node4]
node5.neighbors=[node2] dfs1(node4,nodeset)
dfs(node4)
bfs(node4)
python实现图的遍历(递归和非递归)的更多相关文章
- 数据结构作业——图的存储及遍历(邻接矩阵、邻接表+DFS递归、非递归+BFS)
邻接矩阵存图 /* * @Author: WZY * @School: HPU * @Date: 2018-11-02 18:35:27 * @Last Modified by: WZY * @Las ...
- 数据结构-树以及深度、广度优先遍历(递归和非递归,python实现)
前面我们介绍了队列.堆栈.链表,你亲自动手实践了吗?今天我们来到了树的部分,树在数据结构中是非常重要的一部分,树的应用有很多很多,树的种类也有很多很多,今天我们就先来创建一个普通的树.其他各种各样的树 ...
- 数据结构二叉树的递归与非递归遍历之java,javascript,php实现可编译(1)java
前一段时间,学习数据结构的各种算法,概念不难理解,只是被C++的指针给弄的犯糊涂,于是用java,web,javascript,分别去实现数据结构的各种算法. 二叉树的遍历,本分享只是以二叉树中的先序 ...
- Java实现二叉树的先序、中序、后序、层序遍历(递归和非递归)
二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易 ...
- C实现二叉树(模块化集成,遍历的递归与非递归实现)
C实现二叉树模块化集成 实验源码介绍(源代码的总体介绍):header.h : 头文件链栈,循环队列,二叉树的结构声明和相关函数的声明.LinkStack.c : 链栈的相关操作函数定义.Queue. ...
- 二叉树3种递归和非递归遍历(Java)
import java.util.Stack; //二叉树3种递归和非递归遍历(Java) public class Traverse { /******************一二进制树的定义*** ...
- JAVA递归、非递归遍历二叉树(转)
原文链接: JAVA递归.非递归遍历二叉树 import java.util.Stack; import java.util.HashMap; public class BinTree { priva ...
- 二叉树的创建、遍历(递归和非递归实现)、交换左右子数、求高度(c++实现)
要求:以左右孩子表示法实现链式方式存储的二叉树(lson—rson),以菜单方式设计并完成功能任务:建立并存储树.输出前序遍历结果.输出中序遍历结果.输出后序遍历结果.交换左右子树.统计高度,其中对于 ...
- 二叉树前中后/层次遍历的递归与非递归形式(c++)
/* 二叉树前中后/层次遍历的递归与非递归形式 */ //*************** void preOrder1(BinaryTreeNode* pRoot) { if(pRoot==NULL) ...
- Java - 二叉树递归与非递归
树的定义具有递归特性,因此用递归来遍历比较符合特性,但是用非递归方式就比较麻烦,主要是递归和栈的转换. import java.util.Stack; /** * @author 李文浩 * @ver ...
随机推荐
- apicloud 按返回键
api.addEventListener({ name: 'keyback' }, function(ret, err) { //调取index.html暴露的方法 api.execScript({ ...
- day32 通道 数据共享 进程池
1.管道 格式: conn1,conn2 = Pipe() 管道的两端可以进行全双工通信 如图 进程2创建了管道,它就拥有管道两端的信息,每个端点都能收发信息,它把端点信息传给进程1和进程3 ,它 ...
- js中BOM与DOM的概念与区别
1.BOM 浏览器对象模型 提供了独立于内容而与浏览器窗口进行交互的对象.描述了与浏览器进行交互的方法和接口,可以对浏览器窗口进行访问和操作,譬如可以弹出新的窗口,改变状态栏中的文本,对Cookie的 ...
- 安卓AlertDialog 的使用
引入空间 import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; fin ...
- hdu 1025LIS思路同1257 二分求LIS
题目: Constructing Roads In JGShining's Kingdom Time Limit: 2000/1000 MS (Java/Others) Memory Limit ...
- Hive QL的操作
一.数据定义DDL操作 创建表: --create table为创建一个指定名字的表 create(external) table table_name --external关键字可以让用户创建一个外 ...
- Linux安装配置NFS教程(CentOS 6.5)
一.服务端安装nfs 1.1安装 yum install -y rpcbind yum install -y nfs-utils 1.2配置nfs共享目录 这里以/nfs目录为例 mkdir /nfs ...
- Android 之常用布局
LinearLayout 线性布局. android:orientation="horizontal" 制定线性布局的排列方式 水平 horizontal 垂直 vertical ...
- linux basic test
Linux 1◆ 提供连接 2◆ connection baidu.com 3◆ vm tools install Reboot
- vsCode快捷键设置
// 快捷键设置 keyiing.json // 将键绑定放入此文件中以覆盖默认值 [ /* // 转换大写 { "key" : "ctr ...