【算法题】图的 DFS 和 BFS

本文介绍了如何使用Golang实现深度优先搜索(DFS)和广度优先搜索(BFS)算法,通过示例展示了在节点结构中遍历图的完整过程,适合初学者理解图算法在实际编程中的应用。

 在这里插入图片描述

package main

import "fmt"

type Node struct {
	data string
	next []*Node // 代表每个节点能够访问的结点,比如 v0 的 next 为 v1,v2,v3
}

var visited map[string]bool

func DFS(node *Node) {
	if node == nil || visited[node.data] {
		return
	}

	fmt.Print(node.data, " ")
	visited[node.data] = true
	// 一个结点沿着一条路径走到头,走到头之后再进行下一个结点
	for i := range node.next {
		DFS(node.next[i])
	}
}

func BFS(row []*Node) {
	if len(row) == 0 {
		return
	}

	// 下一层结点的集合
	var nextRow []*Node
	// 一层一层地遍历。未被访问则输出,并将该结点能访问的结点加到 nextRow
	for _, node := range row {
		if !visited[node.data] {
			fmt.Print(node.data, " ")
			visited[node.data] = true
			if len(node.next) != 0 {
				nextRow = append(nextRow, node.next...)
			}
		}
	}
	BFS(nextRow)
}

func main() {
	v0 := &Node{data: "v0"}
	v1 := &Node{data: "v1"}
	v2 := &Node{data: "v2"}
	v3 := &Node{data: "v3"}
	v4 := &Node{data: "v4"}
	v5 := &Node{data: "v5"}
	v6 := &Node{data: "v6"}
	v0.next = append(v0.next, v1, v2, v3)
	v2.next = append(v2.next, v4)
	v1.next = append(v1.next, v4, v5)
	v3.next = append(v3.next, v5)
	v4.next = append(v4.next, v6)
	v5.next = append(v5.next, v6)

	fmt.Print("DFS : ")
	visited = make(map[string]bool)
	DFS(v0)

	fmt.Print("\nBFS : ")
	visited = make(map[string]bool)
	BFS([]*Node{v0})
}

// 运行结果:
// DFS : v0 v1 v4 v6 v5 v2 v3
// BFS : v0 v1 v2 v3 v4 v5 v6

参考:golang BFS DFS_想去南方的gopher的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值