美文网首页让前端飞
DOM树遍历--BFS和DFS

DOM树遍历--BFS和DFS

作者: Quilljou | 来源:发表于2017-07-25 17:48 被阅读175次

数据结构中,树或图有两种遍历方法,BFS--广度优先搜索、DFS--深度优先搜索。

DOM树也是一种树的实现。

如果我们有如下一颗DOM树,如果我们想要遍历它的每一个节点,应该怎么做呢。

<div id="app">
   <div id="header">
     <div id="logo"></div>
     <div id="menu"></div>
   </div>
   <div id="content">
     <div id="article">
       <div id="para1"></div>
       <div id="para2"></div>
       <div id="para3"></div>
     </div>
   </div>
 </div>

DFS

function DFS(node, cb) {
  let deep = 1;  
  DFSdom(node,deep,cb)
}

function DFSdom(node, deep, cb) {
  if(!node)
    return;

  cb(node,deep)

  if(!node.childNodes.length) {
    return;
  }

  deep++;

  Array.from(node.childNodes).forEach(item => DFSdom(item,deep,cb))
}

使用:

DFS(document.getElementById("app"),function (node,deep) {
  if(node.nodeType == 3) // 排除文本节点
    return
  console.log(node,deep);
})

打印结果:

Object {node: div#app, deep: 1}
Object {node: div#header, deep: 2}
Object {node: div#logo, deep: 3}
Object {node: div#menu, deep: 3}
Object {node: div#content, deep: 2}
Object {node: div#article, deep: 3}
Object {node: div#para1, deep: 4}
Object {node: div#para2, deep: 4}
Object {node: div#para3, deep: 4}

DFS的实现是利用递归,递归实现是利用堆栈。所以使用DFS有爆栈的风险。

BFS

function BFS(node,cb) {
  if(!node)
    return;

  var queue = [{
    node: node,
    depth: 1
  }]

  while(queue.length) {
    var current = queue.shift();

    cb(current)

    current.node.childNodes.length && Array.from(current.node.childNodes).forEach(item => {
      queue.push({
        node: item,
        depth: current.depth + 1
      })
    })
  }
}

使用:

BFS(document.getElementById("app"),function (node) {
  if(node.node.nodeType == 3) // 排除文本节点
    return
  console.log(node);
})

打印结果:

Object {node: div#app, depth: 1}
Object {node: div#header, depth: 2}
Object {node: div#content, depth: 2}
Object {node: div#logo, depth: 3}
Object {node: div#menu, depth: 3}
Object {node: div#article, depth: 3}
Object {node: div#para1, depth: 4}
Object {node: div#para2, depth: 4}
Object {node: div#para3, depth: 4}

BFS的实现是利用队列。

相关文章

  • DOM树遍历--BFS和DFS

    数据结构中,树或图有两种遍历方法,BFS--广度优先搜索、DFS--深度优先搜索。 DOM树也是一种树的实现。 如...

  • 图的桥和割点

    内容概要: 图中的桥 图的DFS遍历树和BFS遍历树及其与寻桥算法的关系 图的割点 DFS和BFS的对比小结 桥(...

  • 【算法训练营学习笔记-Week06】一遍不懂就多刷几遍

    字典树(Trie ) 温故知新: 树的定义 二叉树,前中序列遍历,层次遍历 DFS和BFS 二叉搜索树(BFS)定...

  • BFS和DFS

    BFS:广度优先搜索 DFS:深度优先搜索 树的遍历 BFS:A B C D E F G H I DFS: A ...

  • 算法-二叉树的遍历实现

    简述 二叉树的遍历分 DFS【深度优先遍历】 和 BFS【广度优先遍历】 两类,其中 DFS 又分为前序遍历,中序...

  • 题目链接:后序遍历 题目链接:树的直径 bfs: dfs:

  • 刷题7 剑指 Offer — DFS

    树的遍历方式总体分为两类:深度优先搜索(DFS)、广度优先搜索(BFS);常见的 DFS : 先序遍历、中序遍历、...

  • 二叉树遍历

    总结一下二叉树的深度遍历(DFS)和广度遍历(BFS)首先, 创建二叉树的节点: 一、深度遍历 1.1 先序遍历(...

  • JS实现二叉树的遍历(DFS、BFS、前中后序遍历)

    对于二叉树,有深度遍历(DFS)和广度遍历(BFS),深度遍历有前序遍历、中序遍历和后序遍历三种方法,广度遍历也叫...

  • [LeetCode] 226. Invert Binary Tr

    我们学过树的前序遍历(DFS)和层次遍历(BFS),在邓俊辉《数据结构(C++语言版)》的前序遍历和层次遍历的实现...

网友评论

    本文标题:DOM树遍历--BFS和DFS

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