美文网首页
广度优先搜索

广度优先搜索

作者: 欧阳_z | 来源:发表于2020-09-06 12:23 被阅读0次

    1、简介
    BFS(Breadth-First-Search):广度优先搜索,也叫宽度优先搜索。是一种“地毯式”层层推进的搜索策略,即先查找离起始结点最近的,然后是次近的,再依次往外查找,比较符合人的思维。

    把初始结点放入队列中,取队列长度 len,执行循环 len 次:
    每次从队列首位取出一个结点,把它下一层的结点加入队列的末尾,
    并更新 len 的值,len 的值代表每一层的节点个数,
    重复上述的步骤,直到没有新的结点为止。

    如果是图,需要一个 Set (通常命名为 visited)来保存已经被访问过的结点,防止回路;
    如果是树则不需要。

    2、应用
    (1)二叉树的层序遍历
    下面是 Go 语言版的完整代码,可运行:

    package main
    
    import (
    "fmt"
    "container/list"
    )
    
    type TreeNode struct {
        Val int
        Left *TreeNode
        Right *TreeNode
    }
    
    func levelOrderBFS(root *TreeNode) [][]int {
        if nil == root{
            return [][]int{}
        }
    
        result := [][]int{}
        queue := list.New()
        queue.PushBack(root)
    
        for level_size := 1; level_size > 0; level_size = queue.Len() {
            current_level := make( []int, 0, level_size)
    
            for i:=0; i < level_size; i++ {
                element := queue.Front()
                node := element.Value.(*TreeNode)
                queue.Remove(element)
    
                current_level = append(current_level, node.Val)
    
                if node.Left != nil{
                    queue.PushBack(node.Left)
                }
                if node.Right != nil{
                    queue.PushBack(node.Right)
                }
            }
            result = append(result, current_level)
        }
        return result
    }
    
    func createBST( v []int ) *TreeNode {
        n := len(v)
        if n == 0{
            return nil
        }else if n == 1{
            return & TreeNode{ v[0], nil, nil}
        }
    
        m := n/2
        root := & TreeNode{ v[m], nil, nil}
        root.Left = createBST( v[0:m] )
        root.Right = createBST( v[m+1:] )
        return root
    }
    
    func main() {
        tree := createBST( []int {1,2,3,4,5,6,7} )
        fmt.Println(levelOrderBFS(tree))
    }
    

    (2)二叉树的最大深度
    用一个变量来记录深度,每遍历一层就自增 1,直到没有新的结点为止:

    func maxDepthBFS(root *TreeNode) int {
        if nil == root{
            return 0
        }
        result := 0
        queue := list.New()
        queue.PushBack(root)
    
        for level_size := 1; level_size > 0; level_size = queue.Len() {
            result++
            for i:=0; i < level_size; i++ {
                element := queue.Front()
                queue.Remove(element)
                node := element.Value.(*TreeNode)
                if node.Left != nil {
                    queue.PushBack(node.Left)
                }
                if node.Right != nil {
                    queue.PushBack(node.Right)
                }
            }
        }
        return result
    }
    

    (3)二叉树的最小深度
    用一个变量来记录深度,每遍历一层就自增 1,遇到空节点即可返回:

    func minDepthBFS(root *TreeNode) int {
        if nil == root{
            return 0
        }
        result := 0
        queue := list.New()
        queue.PushBack(root)
    
        for level_size := 1; level_size > 0; level_size = queue.Len() {
            result++
            for i:=0; i < level_size; i++ {
                element := queue.Front()
                node := element.Value.(*TreeNode)
                queue.Remove(element)
                if node.Left == nil || node.Right == nil {
                    return result
                }
                queue.PushBack(node.Left)
                queue.PushBack(node.Right)
            }
        }
        return result
    }
    

    相关文章

      网友评论

          本文标题:广度优先搜索

          本文链接:https://www.haomeiwen.com/subject/vlkcektx.html