美文网首页
深度优先和广度优先遍历算法

深度优先和广度优先遍历算法

作者: max_wwwwww | 来源:发表于2019-03-06 15:19 被阅读0次

DFS深度优先遍历

<div class="root">
    <div class="child1">
        <a href="">link</a>
        <span>text</span>
    </div>
    <div class="child2">
        <span>2</span>
    </div>
</div>

深度优先遍历结果:

[
    div.root,
    div.child1,
    a,
    span,
    div.child2,
    span
]

DFS递归实现:
深度优先需要优先查找子节点,因此需要实现后进先出(栈)

function deepTraversal(node, nodeList) {
    if (node) {
        const children = node.children || []
        nodeList.push(node)
        for (let i = 0 ; i < children.length ; i++) {
            deepTraversal(children[i], nodeList)
        }
    }
    return nodeList
}

递归maybe导致栈溢出!!!

DFS递归优化(尾递归)

function tailD(nodeList=[], stack=[]){
    if(!stack.length) return nodeList
    return tailD([].concat(nodeList,stack[stack.length - 1]),[].concat(stack,Array.from(stack.pop().children||[]).reverse()))
}

使用方式: tailD([], [node])

DFS遍历实现:

function deepTraversal(node) {
    const nodeList = []
    const stack = []
    stack.push(node)
    while (stack.length) {
        let currentNode = stack.pop() // 需要后进先出
        let children = currentNode.children
        nodeList.push(currentNode)
        for (let i=children.length - 1;i>=0;i--){
            stack.push(children[i])
        }
    }
    return nodeList
}

BFS 广度优先遍历

广度优先需要优先查找兄弟节点,因此要实现先进先出(队列)

BFS结果:

[
    div.root,
    div.child1,
    div.child2,
    a,
    span,
    span
]

BFS递归实现:


let queen = [node]
let nodeList = []
let count = 0

function bTraversal() {
    let currentNode = queen[count]
    if (currentNode) {
        let children = currentNode.children || []
        nodeList.push(currentNode)
        queen.push(...children)
        count ++
        bTraversal(count)
    }
    return nodeList
}

BFS遍历实现:

function bTraversal(node) {
    const nodeList = []
    const queen = []
    queen.push(node)
    while (queen.length) {
        let currentNode = queen.shift()
        let children = currentNode.children
        nodeList.push(currentNode)
        for (let i=0;i<children.length;i++){
            queen.push(children[i])
        }
    }
    return nodeList
}

相关文章

  • 搜索

    一、深度优先搜索 图深度优先遍历、深度优先搜索算法求有权图两点最短路径 二、广度优先搜索 图广度优先遍历、广度优先...

  • 【数据结构】广度优先搜索算法BFS

    对于广度优先遍历算法DFS可以参考前一篇文章【数据结构】深度优先搜索算法DFS 广度优先遍历 广度优先遍历(Bre...

  • 多级树的深度优先遍历与广度优先遍历(Java实现)

    多级树的深度优先遍历与广度优先遍历(Java实现) 深度优先遍历与广度优先遍历其实是属于图算法的一种,多级树可以看...

  • 5. 深度优先、广度优先

    1. 二叉树的深度优先遍历和广度优先遍历2. 深度优先搜索递归和非递归实现 深度优先(DFS):前序遍历 广度优先...

  • 前端常见面试题目(六)

    一、介绍下深度优先遍历和广度优先遍历,如何实现 通过用深度优先遍历和广度优先遍历对这个dom树进行查找来理解1、 ...

  • js-树的遍历

    数据 广度优先遍历 深度优先遍历 深度优先不递归

  • 图的遍历,golang实现

    广度优先遍历 深度优先遍历

  • 广度优先遍历和深度优先遍历

    深度优先遍历 广度优先遍历

  • 二叉树遍历

    二叉树的遍历,分为深度优先遍历和广度优先遍历,其中深度优先遍历又分为有前序、中序、后序遍历,广度优先遍历就是按层遍...

  • 爬虫(3-5)

    深度优先和广度优先1 网站的树结构2 深度优先算法和实现3 广度优先算法和实现 深度优先输出A,B,D,E,I,C...

网友评论

      本文标题:深度优先和广度优先遍历算法

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