图的广度优先遍历可以不用队列吗?

pulley 2003-09-23 10:41:40
我知道图的深度优先遍历的非递归算法可以不用栈。有没有不使用队列的广度优先遍历算法?
...全文
1184 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Besich 2003-09-24
  • 打赏
  • 举报
回复
LeeMaRS(偶是小菜虎,不准说我牛!)

老弟,你给的,我怎么看,怎么是深度搜索?
Besich 2003-09-24
  • 打赏
  • 举报
回复
这样子就可以搜索,转化成2叉树了!
当然,这个转化法子,估计你也知道,很多数据结构书中都有介绍

关键是怎么搜索问题!
比方说如果搜索第n层的话,必须搜索pLNode n次,则是第n层。。。。。。

图问题我没考虑过,我说过这是我这两天看The Art Of Computer Programming 后,看到作者转化的时候,突然领悟的,至于图,我感觉方法相似,毕竟图和树联系很紧密
Besich 2003-09-24
  • 打赏
  • 举报
回复
当然可以
首先你要有转化思想
我拿树举例(shit!这两天刚刚看TAOCP学的个新招就这样被你给骗走。。。。。。多给点分)

A
/ | \
B C D
/ | \ /|\
E F GH I J
转化为
A
/
B--C--D
/ /
E--F--GH--I--J
这样搜索,。。。钱不够,先发了,马上到楼下输入点钱继续。。。。
短歌如风 2003-09-24
  • 打赏
  • 举报
回复

深度优先算法之所以可以不用栈,是因为在每一步的结果路径中都包含了这个信息。广度优先恐怕很难不用队列。
短歌如风 2003-09-24
  • 打赏
  • 举报
回复

深度优先算法之所以可以不用栈,是因为在每一步的结果路径中都包含了这个信息。广度优先恐怕很难不用队列。
Besich 2003-09-24
  • 打赏
  • 举报
回复
老天?
搞错了......
我那法子能判断是第几层而已......

sorry......
因为前几天看到这东西,正好能解决以前我的个问题,就......
呵呵
IAmWaistcoat 2003-09-24
  • 打赏
  • 举报
回复
可以
LeeMaRS 2003-09-24
  • 打赏
  • 举报
回复
ft了,昨天大意了,我写的那个的确是DFS,抱歉。
还有就是同意ZhangYv说的。
BSCH,即使是这样转化也还是不行的,要不你试着描述一下算法试试:)

我想不管怎么样,DFS对数据的处理顺序就是运用栈的特性,BFS对数据的处理顺序就是运用队列的特性。至于“栈”“队列”怎么实现,不同的程序可能有不同的方式,但考虑到本质上的时候,还是回回归到“栈”“队列”上来。

不知道今天说的对不对了^^
ZhangYv 2003-09-24
  • 打赏
  • 举报
回复
递归和非递归算法从“程序结构”和“数学逻辑结构”的两个角度来说也是不同的

可能真会存在不用队列的。。。和不用栈的。。。,但程序也只能鳖脚的模拟它们(这种数据结构)的特点。
ZhangYv 2003-09-24
  • 打赏
  • 举报
回复
广度优先遍历算法就是要让搜索的节点先进先出啊,这本来就是队列的特点,为什么要不用队列的广度优先遍历算法?好象没见过...
深度优先的就是要搜索的节点后进先出吧,这本来就是栈的特点,为什么要不用栈的深度度优先遍历算法?
需要注意的是,操作系统中的“栈”和数据结构的“栈”是不同的(概念),
递归和非递归算法从“程序结构”和“数学逻辑结构”也是不同的。

图的深度优先遍历的非递归程序结构的算法可以不用系统堆栈...
LeeMaRS 2003-09-24
  • 打赏
  • 举报
回复
也可以用系统的栈来完成的, 比如经常看到有人这样写FloodFill:
void FloodFill(int x, y);
{
if ((x or y is our of range) || (visited[x][y])) return;
visited[x][y] = 1;
FloodFill(x + 1, y);
FloodFill(x - 1, y);
FloodFill(x, y + 1);
FloodFill(x, y - 1);
}

大意就是这样. 这么写主要就是有个判重方法受到一些限制, 不能直接搜索队例判重了. 而且显然效率不太好.

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧