菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
170
0

golang BFS DFS

原创
05/13 14:22
阅读数 55888

突然想起一个面试题,用go实现不太好写,明天在想有什么好的方法实现图,暂时就想到这么实现,具体分析看代码注释

 

package main

import "fmt"

type list struct {
data string
next []*list //代表每个节点能够访问的节点,比如v0的next为v1,v2,v3
}
var m map[string]bool
func DFS(row []*list){
if len(row) == 0 {
return
}
//跟一个节点沿着一条路径走到头,走到头之后再进行下一个节点
for i := range row {
if ok,_ := m[row[i].data];!ok{
fmt.Print(row[i].data, " ")
m[row[i].data] = true
if len(row[i].next) > 0 {
DFS(row[i].next)
}
}
}
}

func BFS(row []*list){
if len(row) == 0 {
return
}
//下一层的点的集合
nextRow := make([]*list, 0)
//遍历当前层所有点,未被访问则输出并将该点能访问的点加到nextRow
for i := range row {
if ok, _ := m[row[i].data];!ok {
fmt.Print(row[i].data," ")
m[row[i].data] = true
if len(row[i].next) != 0 {
nextRow = append(nextRow, row[i].next...)
}
}
}
BFS(nextRow)
}

func main(){
m = make(map[string]bool)
v0 := &list{data : "v0"}
v1 := &list{data : "v1"}
v2 := &list{data : "v2"}
v3 := &list{data : "v3"}
v4 := &list{data : "v4"}
v5 := &list{data : "v5"}
v6 := &list{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 : ")
DFS([]*list{v0})
m = make(map[string]bool)
fmt.Print("\nBFS : ")
BFS([]*list{v0})
}

 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
肯定不是最好的实现方法,欢迎一起讨论
————————————————
版权声明:本文为CSDN博主「想去南方的gopher」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_44477844/article/details/109760302

 

 

层序遍历模板,语言为 golang

func bfs(p *TreeNode) []int {
    res := make([]int, 0)
    if p == nil {
        return res
    }
    queue := []*TreeNode{p}
    for len(queue) > 0 {
        length := len(queue)
        for length > 0 {
            length--
            if queue[0].Left != nil {
                queue = append(queue, queue[0].Left)
            }
            if queue[0].Right != nil {
                queue = append(queue, queue[0].Right)
            }
            res = append(res, queue[0].Val)
            queue = queue[1:]
        }
    }
    return res
}

 

发表评论

0/200
170 点赞
0 评论
收藏