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