public class Tst { static TreeNode treeFactory() { TreeNode a = new TreeNode("a"); TreeNode b = new TreeNode("b"); TreeNode c = new TreeNode("c"); TreeNode d = new TreeNode("d"); TreeNode e = new TreeNode("e"); TreeNode f = new TreeNode("f"); TreeNode g = new TreeNode("g"); TreeNode h = new TreeNode("h"); a.children.add(b); a.children.add(c); b.children.add(d); b.children.add(e); c.children.add(f); c.children.add(g); e.children.add(h); return a; } static void printTreeDepthFirst(TreeNode root) { System.out.print(root); if(! root.children.isEmpty()) { for(TreeNode child : root.children) printTreeDepthFirst(child); } } static ArrayList<ArrayList<TreeNode>> row; static void printTreeWidthFirst(TreeNode root) { transferTree(root, 0); for(ArrayList<TreeNode> list : row) { for(TreeNode node : list) System.out.print(node); } } private static void transferTree(TreeNode root, int i) { putNode2row(root, i); if(! root.children.isEmpty()) { i++; for(TreeNode child : root.children) transferTree(child, i); } } private static void putNode2row(TreeNode node, int i) { if(row.size() <= i) { row.add(new ArrayList<TreeNode>()); } row.get(i).add(node); } public static void main(String[] args) { printTreeDepthFirst(treeFactory()); System.out.println(); row = new ArrayList<ArrayList<TreeNode>>(); printTreeWidthFirst(treeFactory()); } } class TreeNode { List<TreeNode> children = new ArrayList<TreeNode>(); String name; public TreeNode(String name) { this.name = name; } public String toString() { return name; } }
输出 写道
abdehcfg
abcdefgh
abcdefgh
上面代码中的广度优先的遍历,是先递归遍历,把递归的数据放到List的List中,转化为层的结构。空间和时间都使用的比较多。看了《数据结构P170》对图的广度优先遍历。可以使用Queue存当前层的节点,优化这个方法:
static void printTreeWidthFirst(TreeNode root) { Queue<TreeNode> queue = new ArrayDeque<TreeNode>(); queue.add(root); System.out.print(root); while(!queue.isEmpty()) { root = queue.poll(); for(TreeNode child : root.children) { System.out.print(child); queue.add(child); } } }
相关推荐
以邻接表为存储结构,实现连通无向图的深度优先和广度优先遍历。以用户指定的结点为起点,分别输出每种遍历下的结点访问序列和相应生成树的边集。 注: 1.代码共182行。 2.代码经过多次编译运行,无错误。
程序设计任务: 设计一个程序,实现以邻接表或者邻接矩阵为存储结构,实现连通无向图的深度优先和广度优先遍历。基本要求:以邻接表或者邻接矩阵为存储结构,实现连通无向图的深度优先和广度优先遍历。以用户指定的...
深度优先搜索遍历类似于树的先序遍历。假定给定图G的初态是所有顶点均未被访问过,在G中任选一个顶点i作为遍历的初始 点,则深度优先搜索递归调用包含以下操作: (1)访问搜索到的未被访问的邻接点; (2)将此...
邻接表表示的图的深度优先搜索和广度优先搜索程序,这是数据结构的实验
以邻接表为存储结构,实现连通无向图的深度优先和广度优先遍历。以用户指定的结点为起点,分别输出每种遍历下的结点访问序列和相应生成树的边集。 [实现提示] 设图的结点不超过30个,每个结点用一个编号表示(如果...
深度优先搜索(亦称深度优先遍历,Deep First Search,简称DFS),广度优先搜索(亦称广度优先遍历,Breadth First Search,简称BFS)都是很基础的算法,也是大家很熟悉的。算法,又叫宽度优先遍历,或横向优先遍历...
c数据结构链表数组以及深度优先遍历,假设给定图G的初态是所有顶点均未曾访问过。在G中任选一顶点v为初始出发点(源点),则深度优先遍历可定义如下:首先访问出发点v,并将其标记为已访问过;然后依次从v出发搜索v的...
其中,广度优先搜索(Breadth-First Search,简称BFS)和深度优先搜索(Depth-First Search,简称DFS)是两种最基本且广泛使用的图遍历算法。 广度优先搜索(BFS)是一种按层次遍历图的算法。它从图的某个顶点开始...
以邻接表为存储结构,实现创建图、销毁图、查找顶点、获取顶点值、顶点赋值、获得第一邻接点、获得下一邻接点、插入顶点、删除顶点、插入弧、删除弧、深度优先搜索遍历、广深度优先搜索遍历等操作 注: 1.系统设计 2...
深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次.
深度优先遍历DFS 与树的先序遍历比较类似。 假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的...
首先将根节点入队列,然后检测队列是否为空,如果不为空,将队列出队列,访问出队列的节点,然后将该节点的子节点指针入队列,依次循环下去,直至队列为空,终止循环,从而完成整个多叉树的层次优先遍历。
深度优先搜索算法的基本思想是采用递归的方式,从某个顶点出发,首先访问该顶点,然后依次访问它的所有未被访问过的邻接点,直到所有与当前顶点有路径相通的顶点都被访问到。若此时图中尚有顶点未被访问,则另选图中...
图存在两种遍历方式,深度优先遍历和广度优先遍历,广度优先遍历基本思路是假设从图中某顶点U出发,在访问了顶点U之后依次访问U的各个未访问的领接点,然后分别从这些领接点出发依次访问他们的领接点,并使先访问的...
邻接表深度广度优先搜索测试程序
C#,图论与图算法,有向图...此外,对于无权图,任何生成树都是最小生成树,我们可以使用深度优先遍历或宽度优先遍历来查找生成树。 2) 对等网络。在像BitTorrent这样的对等网络中,广度优先搜索用于查找所有邻
dfs深度优先搜索(DFS)是一种计算机科学中的算法,用于遍历或搜索树或图。它通过从起始节点开始,沿着一个分支深入到不能再深入为止,然后回溯到上一个节点,继续沿着另一个分支深入,以此类推,直到遍历完所有节点...
然后,对于起始顶点的每个邻居顶点,如果它尚未被访问过,则调用递归的dfs()方法进行深度优先搜索。 在示例代码中,我们以顶点0作为起始顶点调用dfs(0, visited)方法进行遍历。最终的输出结果将会是按照深度优先...
本文实例讲述了python数据结构之图深度优先和广度优先用法。分享给大家供大家参考。具体如下: 首先有一个概念:回溯 回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,...
深度优先搜索(Depth-First Search,DFS)是一种用于遍历或搜索树或图的算法。这个算法会尽可能深地搜索树的分支。当节点v的所在边都已被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已...