zoukankan      html  css  js  c++  java
  • golang BFS DFS

    突然想起一个面试题,用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(" BFS : ")
    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
    }
    

     

  • 相关阅读:
    重要网址
    线程同步与异步
    常量指针 和 指针常量
    权限设置
    COM组件技术
    抽象类与接口及其派生类的关系
    C++中 #pragma 的使用方法
    [原创].基于SyntaxHighlighter的Verilog HDL高亮组件
    [转载].图解SDRAM工作流程:仓库物语(高手进阶,终极内存技术指南——完整/进阶版)
    [笔记].原来Notepad++也有列模式
  • 原文地址:https://www.cnblogs.com/ExMan/p/14621821.html
Copyright © 2011-2022 走看看